﻿
/* band.js */
Timeline._Band = function(B, G, C) {
	if (B.autoWidth && typeof G.width == "string") {
		G.width = G.width.indexOf("%") > -1 ? 0 : parseInt(G.width);
	}
	this._timeline = B;
	this._bandInfo = G;
	this._index = C;
	this._locale = ("locale" in G) ? G.locale : Timeline.getDefaultLocale();
	this._timeZone = ("timeZone" in G) ? G.timeZone : 0;
	this._labeller = ("labeller" in G) ? G.labeller : (("createLabeller" in B
			.getUnit()) ? B.getUnit().createLabeller(this._locale,
			this._timeZone) : new Timeline.GregorianDateLabeller(this._locale,
			this._timeZone));
	this._theme = G.theme;
	this._zoomIndex = ("zoomIndex" in G) ? G.zoomIndex : 0;
	this._zoomSteps = ("zoomSteps" in G) ? G.zoomSteps : null;
	this._dragging = false;
	this._changing = false;
	this._originalScrollSpeed = 5;
	this._scrollSpeed = this._originalScrollSpeed;
	this._onScrollListeners = [];
	var A = this;
	this._syncWithBand = null;
	this._syncWithBandHandler = function(H) {
		A._onHighlightBandScroll();
	};
	this._selectorListener = function(H) {
		A._onHighlightBandScroll();
	};
	var E = this._timeline.getDocument().createElement("div");
	E.className = "timeline-band-input";
	this._timeline.addDiv(E);
	this._keyboardInput = document.createElement("input");
	this._keyboardInput.type = "text";
	E.appendChild(this._keyboardInput);
	SimileAjax.DOM.registerEventWithObject(this._keyboardInput, "keydown",
			this, "_onKeyDown");
	SimileAjax.DOM.registerEventWithObject(this._keyboardInput, "keyup", this,
			"_onKeyUp");
	this._div = this._timeline.getDocument().createElement("div");
	this._div.id = "timeline-band-" + C;
	this._div.className = "timeline-band timeline-band-" + C;
	this._timeline.addDiv(this._div);
	SimileAjax.DOM.registerEventWithObject(this._div, "mousedown", this,
			"_onMouseDown");
	SimileAjax.DOM.registerEventWithObject(this._div, "mousemove", this,
			"_onMouseMove");
	SimileAjax.DOM.registerEventWithObject(this._div, "mouseup", this,
			"_onMouseUp");
	SimileAjax.DOM.registerEventWithObject(this._div, "mouseout", this,
			"_onMouseOut");
	SimileAjax.DOM.registerEventWithObject(this._div, "dblclick", this,
			"_onDblClick");
	var F = this._theme != null ? this._theme.mouseWheel : "scroll";
	if (F === "zoom" || F === "scroll" || this._zoomSteps) {
		if (SimileAjax.Platform.browser.isFirefox) {
			SimileAjax.DOM.registerEventWithObject(this._div, "DOMMouseScroll",
					this, "_onMouseScroll");
		} else {
			SimileAjax.DOM.registerEventWithObject(this._div, "mousewheel",
					this, "_onMouseScroll");
		}
	}
	this._innerDiv = this._timeline.getDocument().createElement("div");
	this._innerDiv.className = "timeline-band-inner";
	this._div.appendChild(this._innerDiv);
	this._ether = G.ether;
	G.ether.initialize(this, B);
	this._etherPainter = G.etherPainter;
	G.etherPainter.initialize(this, B);
	this._eventSource = G.eventSource;
	if (this._eventSource) {
		this._eventListener = {
			onAddMany : function() {
				A._onAddMany();
			},
			onClear : function() {
				A._onClear();
			}
		};
		this._eventSource.addListener(this._eventListener);
	}
	this._eventPainter = G.eventPainter;
	this._eventTracksNeeded = 0;
	this._eventTrackIncrement = 0;
	G.eventPainter.initialize(this, B);
	this._decorators = ("decorators" in G) ? G.decorators : [];
	for ( var D = 0; D < this._decorators.length; D++) {
		this._decorators[D].initialize(this, B);
	}
};
Timeline._Band.SCROLL_MULTIPLES = 5;
Timeline._Band.prototype.dispose = function() {
	this.closeBubble();
	if (this._eventSource) {
		this._eventSource.removeListener(this._eventListener);
		this._eventListener = null;
		this._eventSource = null;
	}
	this._timeline = null;
	this._bandInfo = null;
	this._labeller = null;
	this._ether = null;
	this._etherPainter = null;
	this._eventPainter = null;
	this._decorators = null;
	this._onScrollListeners = null;
	this._syncWithBandHandler = null;
	this._selectorListener = null;
	this._div = null;
	this._innerDiv = null;
	this._keyboardInput = null;
};
Timeline._Band.prototype.addOnScrollListener = function(A) {
	this._onScrollListeners.push(A);
};
Timeline._Band.prototype.removeOnScrollListener = function(B) {
	for ( var A = 0; A < this._onScrollListeners.length; A++) {
		if (this._onScrollListeners[A] == B) {
			this._onScrollListeners.splice(A, 1);
			break;
		}
	}
};
Timeline._Band.prototype.setSyncWithBand = function(B, A) {
	if (this._syncWithBand) {
		this._syncWithBand.removeOnScrollListener(this._syncWithBandHandler);
	}
	this._syncWithBand = B;
	this._syncWithBand.addOnScrollListener(this._syncWithBandHandler);
	this._highlight = A;
	this._positionHighlight();
};
Timeline._Band.prototype.getLocale = function() {
	return this._locale;
};
Timeline._Band.prototype.getTimeZone = function() {
	return this._timeZone;
};
Timeline._Band.prototype.getLabeller = function() {
	return this._labeller;
};
Timeline._Band.prototype.getIndex = function() {
	return this._index;
};
Timeline._Band.prototype.getEther = function() {
	return this._ether;
};
Timeline._Band.prototype.getEtherPainter = function() {
	return this._etherPainter;
};
Timeline._Band.prototype.getEventSource = function() {
	return this._eventSource;
};
Timeline._Band.prototype.getEventPainter = function() {
	return this._eventPainter;
};
Timeline._Band.prototype.getTimeline = function() {
	return this._timeline;
};
Timeline._Band.prototype.updateEventTrackInfo = function(A, B) {
	this._eventTrackIncrement = B;
	if (A > this._eventTracksNeeded) {
		this._eventTracksNeeded = A;
	}
};
Timeline._Band.prototype.checkAutoWidth = function() {
	if (!this._timeline.autoWidth) {
		return;
	}
	var C = this._eventPainter.getType() == "overview";
	var A = C ? this._theme.event.overviewTrack.autoWidthMargin
			: this._theme.event.track.autoWidthMargin;
	var B = Math
			.ceil((this._eventTracksNeeded + A) * this._eventTrackIncrement);
	B += C ? this._theme.event.overviewTrack.offset
			: this._theme.event.track.offset;
	var D = this._bandInfo;
	if (B != D.width) {
		D.width = B;
	}
};
Timeline._Band.prototype.layout = function() {
	this.paint();
};
Timeline._Band.prototype.paint = function() {
	this._etherPainter.paint();
	this._paintDecorators();
	this._paintEvents();
};
Timeline._Band.prototype.softLayout = function() {
	this.softPaint();
};
Timeline._Band.prototype.softPaint = function() {
	this._etherPainter.softPaint();
	this._softPaintDecorators();
	this._softPaintEvents();
};
Timeline._Band.prototype.setBandShiftAndWidth = function(A, D) {
	var C = this._keyboardInput.parentNode;
	var B = A + Math.floor(D / 2);
	if (this._timeline.isHorizontal()) {
		this._div.style.top = A + "px";
		this._div.style.height = D + "px";
		C.style.top = B + "px";
		C.style.left = "-1em";
	} else {
		this._div.style.left = A + "px";
		this._div.style.width = D + "px";
		C.style.left = B + "px";
		C.style.top = "-1em";
	}
};
Timeline._Band.prototype.getViewWidth = function() {
	if (this._timeline.isHorizontal()) {
		return this._div.offsetHeight;
	} else {
		return this._div.offsetWidth;
	}
};
Timeline._Band.prototype.setViewLength = function(A) {
	this._viewLength = A;
	this._recenterDiv();
	this._onChanging();
};
Timeline._Band.prototype.getViewLength = function() {
	return this._viewLength;
};
Timeline._Band.prototype.getTotalViewLength = function() {
	return Timeline._Band.SCROLL_MULTIPLES * this._viewLength;
};
Timeline._Band.prototype.getViewOffset = function() {
	return this._viewOffset;
};
Timeline._Band.prototype.getMinDate = function() {
	return this._ether.pixelOffsetToDate(this._viewOffset);
};
Timeline._Band.prototype.getMaxDate = function() {
	return this._ether.pixelOffsetToDate(this._viewOffset
			+ Timeline._Band.SCROLL_MULTIPLES * this._viewLength);
};
Timeline._Band.prototype.getMinVisibleDate = function() {
	return this._ether.pixelOffsetToDate(0);
};
Timeline._Band.prototype.getMinVisibleDateAfterDelta = function(A) {
	return this._ether.pixelOffsetToDate(A);
};
Timeline._Band.prototype.getMaxVisibleDate = function() {
	return this._ether.pixelOffsetToDate(this._viewLength);
};
Timeline._Band.prototype.getMaxVisibleDateAfterDelta = function(A) {
	return this._ether.pixelOffsetToDate(this._viewLength + A);
};
Timeline._Band.prototype.getCenterVisibleDate = function() {
	return this._ether.pixelOffsetToDate(this._viewLength / 2);
};
Timeline._Band.prototype.setMinVisibleDate = function(A) {
	if (!this._changing) {
		this._moveEther(Math.round(-this._ether.dateToPixelOffset(A)));
	}
};
Timeline._Band.prototype.setMaxVisibleDate = function(A) {
	if (!this._changing) {
		this._moveEther(Math.round(this._viewLength
				- this._ether.dateToPixelOffset(A)));
	}
};
Timeline._Band.prototype.setCenterVisibleDate = function(A) {
	if (!this._changing) {
		this._moveEther(Math.round(this._viewLength / 2
				- this._ether.dateToPixelOffset(A)));
	}
};
Timeline._Band.prototype.dateToPixelOffset = function(A) {
	return this._ether.dateToPixelOffset(A) - this._viewOffset;
};
Timeline._Band.prototype.pixelOffsetToDate = function(A) {
	return this._ether.pixelOffsetToDate(A + this._viewOffset);
};
Timeline._Band.prototype.createLayerDiv = function(C, A) {
	var D = this._timeline.getDocument().createElement("div");
	D.className = "timeline-band-layer"
			+ (typeof A == "string" ? (" " + A) : "");
	D.style.zIndex = C;
	this._innerDiv.appendChild(D);
	var B = this._timeline.getDocument().createElement("div");
	B.className = "timeline-band-layer-inner";
	if (SimileAjax.Platform.browser.isIE) {
		B.style.cursor = "move";
	} else {
		B.style.cursor = "-moz-grab";
	}
	D.appendChild(B);
	return B;
};
Timeline._Band.prototype.removeLayerDiv = function(A) {
	this._innerDiv.removeChild(A.parentNode);
};
Timeline._Band.prototype.scrollToCenter = function(A, C) {
	var B = this._ether.dateToPixelOffset(A);
	if (B < -this._viewLength / 2) {
		this.setCenterVisibleDate(this.pixelOffsetToDate(B + this._viewLength));
	} else {
		if (B > 3 * this._viewLength / 2) {
			this.setCenterVisibleDate(this.pixelOffsetToDate(B
					- this._viewLength));
		}
	}
	this._autoScroll(Math.round(this._viewLength / 2
			- this._ether.dateToPixelOffset(A)), C);
};
Timeline._Band.prototype.showBubbleForEvent = function(C) {
	var A = this.getEventSource().getEvent(C);
	if (A) {
		var B = this;
		this.scrollToCenter(A.getStart(), function() {
			B._eventPainter.showBubble(A);
		});
	}
};
Timeline._Band.prototype.zoom = function(C, A, F, E) {
	if (!this._zoomSteps) {
		return;
	}
	A += this._viewOffset;
	var D = this._ether.pixelOffsetToDate(A);
	var B = this._ether.zoom(C);
	this._etherPainter.zoom(B);
	this._moveEther(Math.round(-this._ether.dateToPixelOffset(D)));
	this._moveEther(A);
};
Timeline._Band.prototype._onMouseDown = function(B, A, C) {
	this.closeBubble();
	this._dragging = true;
	this._dragX = A.clientX;
	this._dragY = A.clientY;
};
Timeline._Band.prototype._onMouseMove = function(D, A, E) {
	if (this._dragging) {
		var C = A.clientX - this._dragX;
		var B = A.clientY - this._dragY;
		this._dragX = A.clientX;
		this._dragY = A.clientY;
		this._moveEther(this._timeline.isHorizontal() ? C : B);
		this._positionHighlight();
	}
};
Timeline._Band.prototype._onMouseUp = function(B, A, C) {
	this._dragging = false;
	this._keyboardInput.focus();
};
Timeline._Band.prototype._onMouseOut = function(C, B, D) {
	var A = SimileAjax.DOM.getEventRelativeCoordinates(B, C);
	A.x += this._viewOffset;
	if (A.x < 0 || A.x > C.offsetWidth || A.y < 0 || A.y > C.offsetHeight) {
		this._dragging = false;
	}
};
Timeline._Band.prototype._onMouseScroll = function(G, H, B) {
	var A = new Date();
	A = A.getTime();
	if (!this._lastScrollTime || ((A - this._lastScrollTime) > 50)) {
		this._lastScrollTime = A;
		var I = 0;
		if (H.wheelDelta) {
			I = H.wheelDelta / 120;
		} else {
			if (H.detail) {
				I = -H.detail / 3;
			}
		}
		var F = this._theme.mouseWheel;
		if (this._zoomSteps || F === "zoom") {
			var E = SimileAjax.DOM.getEventRelativeCoordinates(H, G);
			if (I != 0) {
				var D;
				if (I > 0) {
					D = true;
				}
				if (I < 0) {
					D = false;
				}
				this._timeline.zoom(D, E.x, E.y, G);
			}
		} else {
			if (F === "scroll") {
				var C = 50 * (I < 0 ? -1 : 1);
				this._moveEther(C);
			}
		}
	}
	if (H.stopPropagation) {
		H.stopPropagation();
	}
	H.cancelBubble = true;
	if (H.preventDefault) {
		H.preventDefault();
	}
	H.returnValue = false;
};
Timeline._Band.prototype._onDblClick = function(C, B, E) {
	var A = SimileAjax.DOM.getEventRelativeCoordinates(B, C);
	var D = A.x - (this._viewLength / 2 - this._viewOffset);
	this._autoScroll(-D);
};
Timeline._Band.prototype._onKeyDown = function(B, A, C) {
	if (!this._dragging) {
		switch (A.keyCode) {
		case 27:
			break;
		case 37:
		case 38:
			this._scrollSpeed = Math
					.min(50, Math.abs(this._scrollSpeed * 1.05));
			this._moveEther(this._scrollSpeed);
			break;
		case 39:
		case 40:
			this._scrollSpeed = -Math.min(50, Math
					.abs(this._scrollSpeed * 1.05));
			this._moveEther(this._scrollSpeed);
			break;
		default:
			return true;
		}
		this.closeBubble();
		SimileAjax.DOM.cancelEvent(A);
		return false;
	}
	return true;
};
Timeline._Band.prototype._onKeyUp = function(B, A, C) {
	if (!this._dragging) {
		this._scrollSpeed = this._originalScrollSpeed;
		switch (A.keyCode) {
		case 35:
			this.setCenterVisibleDate(this._eventSource.getLatestDate());
			break;
		case 36:
			this.setCenterVisibleDate(this._eventSource.getEarliestDate());
			break;
		case 33:
			this._autoScroll(this._timeline.getPixelLength());
			break;
		case 34:
			this._autoScroll(-this._timeline.getPixelLength());
			break;
		default:
			return true;
		}
		this.closeBubble();
		SimileAjax.DOM.cancelEvent(A);
		return false;
	}
	return true;
};
Timeline._Band.prototype._autoScroll = function(D, C) {
	var A = this;
	var B = SimileAjax.Graphics.createAnimation(function(E, F) {
		A._moveEther(F);
	}, 0, D, 1000, C);
	B.run();
};
Timeline._Band.prototype._moveEther = function(A) {
	this.closeBubble();
	if (!this._timeline.shiftOK(this._index, A)) {
		return;
	}
	this._viewOffset += A;
	this._ether.shiftPixels(-A);
	if (this._timeline.isHorizontal()) {
		this._div.style.left = this._viewOffset + "px";
	} else {
		this._div.style.top = this._viewOffset + "px";
	}
	if (this._viewOffset > -this._viewLength * 0.5
			|| this._viewOffset < -this._viewLength
					* (Timeline._Band.SCROLL_MULTIPLES - 1.5)) {
		this._recenterDiv();
	} else {
		this.softLayout();
	}
	this._onChanging();
};
Timeline._Band.prototype._onChanging = function() {
	this._changing = true;
	this._fireOnScroll();
	this._setSyncWithBandDate();
	this._changing = false;
};
Timeline._Band.prototype.busy = function() {
	return (this._changing);
};
Timeline._Band.prototype._fireOnScroll = function() {
	for ( var A = 0; A < this._onScrollListeners.length; A++) {
		this._onScrollListeners[A](this);
	}
};
Timeline._Band.prototype._setSyncWithBandDate = function() {
	if (this._syncWithBand) {
		var A = this._ether.pixelOffsetToDate(this.getViewLength() / 2);
		this._syncWithBand.setCenterVisibleDate(A);
	}
};
Timeline._Band.prototype._onHighlightBandScroll = function() {
	if (this._syncWithBand) {
		var A = this._syncWithBand.getCenterVisibleDate();
		var B = this._ether.dateToPixelOffset(A);
		this._moveEther(Math.round(this._viewLength / 2 - B));
		if (this._highlight) {
			this._etherPainter.setHighlight(this._syncWithBand
					.getMinVisibleDate(), this._syncWithBand
					.getMaxVisibleDate());
		}
	}
};
Timeline._Band.prototype._onAddMany = function() {
	this._paintEvents();
};
Timeline._Band.prototype._onClear = function() {
	this._paintEvents();
};
Timeline._Band.prototype._positionHighlight = function() {
	if (this._syncWithBand) {
		var A = this._syncWithBand.getMinVisibleDate();
		var B = this._syncWithBand.getMaxVisibleDate();
		if (this._highlight) {
			this._etherPainter.setHighlight(A, B);
		}
	}
};
Timeline._Band.prototype._recenterDiv = function() {
	this._viewOffset = -this._viewLength
			* (Timeline._Band.SCROLL_MULTIPLES - 1) / 2;
	if (this._timeline.isHorizontal()) {
		this._div.style.left = this._viewOffset + "px";
		this._div.style.width = (Timeline._Band.SCROLL_MULTIPLES * this._viewLength)
				+ "px";
	} else {
		this._div.style.top = this._viewOffset + "px";
		this._div.style.height = (Timeline._Band.SCROLL_MULTIPLES * this._viewLength)
				+ "px";
	}
	this.layout();
};
Timeline._Band.prototype._paintEvents = function() {
	this._eventPainter.paint();
};
Timeline._Band.prototype._softPaintEvents = function() {
	this._eventPainter.softPaint();
};
Timeline._Band.prototype._paintDecorators = function() {
	for ( var A = 0; A < this._decorators.length; A++) {
		this._decorators[A].paint();
	}
};
Timeline._Band.prototype._softPaintDecorators = function() {
	for ( var A = 0; A < this._decorators.length; A++) {
		this._decorators[A].softPaint();
	}
};
Timeline._Band.prototype.closeBubble = function() {
	SimileAjax.WindowManager.cancelPopups();
};

/* compact-painter.js */
Timeline.CompactEventPainter = function(A) {
	this._params = A;
	this._onSelectListeners = [];
	this._filterMatcher = null;
	this._highlightMatcher = null;
	this._frc = null;
	this._eventIdToElmt = {};
};
Timeline.CompactEventPainter.prototype.initialize = function(B, A) {
	this._band = B;
	this._timeline = A;
	this._backLayer = null;
	this._eventLayer = null;
	this._lineLayer = null;
	this._highlightLayer = null;
	this._eventIdToElmt = null;
};
Timeline.CompactEventPainter.prototype.addOnSelectListener = function(A) {
	this._onSelectListeners.push(A);
};
Timeline.CompactEventPainter.prototype.removeOnSelectListener = function(B) {
	for ( var A = 0; A < this._onSelectListeners.length; A++) {
		if (this._onSelectListeners[A] == B) {
			this._onSelectListeners.splice(A, 1);
			break;
		}
	}
};
Timeline.CompactEventPainter.prototype.getFilterMatcher = function() {
	return this._filterMatcher;
};
Timeline.CompactEventPainter.prototype.setFilterMatcher = function(A) {
	this._filterMatcher = A;
};
Timeline.CompactEventPainter.prototype.getHighlightMatcher = function() {
	return this._highlightMatcher;
};
Timeline.CompactEventPainter.prototype.setHighlightMatcher = function(A) {
	this._highlightMatcher = A;
};
Timeline.CompactEventPainter.prototype.paint = function() {
	var N = this._band.getEventSource();
	if (N == null) {
		return;
	}
	this._eventIdToElmt = {};
	this._prepareForPainting();
	var O = this._params.theme;
	var L = O.event;
	var G = {
		trackOffset : "trackOffset" in this._params ? this._params.trackOffset
				: 10,
		trackHeight : "trackHeight" in this._params ? this._params.trackHeight
				: 10,
		tapeHeight : O.event.tape.height,
		tapeBottomMargin : "tapeBottomMargin" in this._params ? this._params.tapeBottomMargin
				: 2,
		labelBottomMargin : "labelBottomMargin" in this._params ? this._params.labelBottomMargin
				: 5,
		labelRightMargin : "labelRightMargin" in this._params ? this._params.labelRightMargin
				: 5,
		defaultIcon : L.instant.icon,
		defaultIconWidth : L.instant.iconWidth,
		defaultIconHeight : L.instant.iconHeight,
		customIconWidth : "iconWidth" in this._params ? this._params.iconWidth
				: L.instant.iconWidth,
		customIconHeight : "iconHeight" in this._params ? this._params.iconHeight
				: L.instant.iconHeight,
		iconLabelGap : "iconLabelGap" in this._params ? this._params.iconLabelGap
				: 2,
		iconBottomMargin : "iconBottomMargin" in this._params ? this._params.iconBottomMargin
				: 2
	};
	if ("compositeIcon" in this._params) {
		G.compositeIcon = this._params.compositeIcon;
		G.compositeIconWidth = this._params.compositeIconWidth
				|| G.customIconWidth;
		G.compositeIconHeight = this._params.compositeIconHeight
				|| G.customIconHeight;
	} else {
		G.compositeIcon = G.defaultIcon;
		G.compositeIconWidth = G.defaultIconWidth;
		G.compositeIconHeight = G.defaultIconHeight;
	}
	G.defaultStackIcon = "icon" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.icon
			: G.defaultIcon;
	G.defaultStackIconWidth = "iconWidth" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.iconWidth
			: G.defaultIconWidth;
	G.defaultStackIconHeight = "iconHeight" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.iconHeight
			: G.defaultIconHeight;
	var B = this._band.getMinDate();
	var D = this._band.getMaxDate();
	var R = (this._filterMatcher != null) ? this._filterMatcher : function(S) {
		return true;
	};
	var Q = (this._highlightMatcher != null) ? this._highlightMatcher
			: function(S) {
				return -1;
			};
	var F = N.getEventIterator(B, D);
	var H = "stackConcurrentPreciseInstantEvents" in this._params
			&& typeof this._params.stackConcurrentPreciseInstantEvents == "object";
	var P = "collapseConcurrentPreciseInstantEvents" in this._params
			&& this._params.collapseConcurrentPreciseInstantEvents;
	if (P || H) {
		var M = [];
		var A = null;
		while (F.hasNext()) {
			var E = F.next();
			if (R(E)) {
				if (!E.isInstant() || E.isImprecise()) {
					this.paintEvent(E, G, this._params.theme, Q(E));
				} else {
					if (A != null
							&& A.getStart().getTime() == E.getStart().getTime()) {
						M[M.length - 1].push(E);
					} else {
						M.push( [ E ]);
						A = E;
					}
				}
			}
		}
		for ( var J = 0; J < M.length; J++) {
			var K = M[J];
			if (K.length == 1) {
				this.paintEvent(K[0], G, this._params.theme, Q(E));
			} else {
				var C = -1;
				for ( var I = 0; C < 0 && I < K.length; I++) {
					C = Q(K[I]);
				}
				if (H) {
					this.paintStackedPreciseInstantEvents(K, G,
							this._params.theme, C);
				} else {
					this.paintCompositePreciseInstantEvents(K, G,
							this._params.theme, C);
				}
			}
		}
	} else {
		while (F.hasNext()) {
			var E = F.next();
			if (R(E)) {
				this.paintEvent(E, G, this._params.theme, Q(E));
			}
		}
	}
	this._highlightLayer.style.display = "block";
	this._lineLayer.style.display = "block";
	this._eventLayer.style.display = "block";
};
Timeline.CompactEventPainter.prototype.softPaint = function() {
};
Timeline.CompactEventPainter.prototype._prepareForPainting = function() {
	var B = this._band;
	if (this._backLayer == null) {
		this._backLayer = this._band.createLayerDiv(0, "timeline-band-events");
		this._backLayer.style.visibility = "hidden";
		var A = document.createElement("span");
		A.className = "timeline-event-label";
		this._backLayer.appendChild(A);
		this._frc = SimileAjax.Graphics.getFontRenderingContext(A);
	}
	this._frc.update();
	this._tracks = [];
	if (this._highlightLayer != null) {
		B.removeLayerDiv(this._highlightLayer);
	}
	this._highlightLayer = B.createLayerDiv(105, "timeline-band-highlights");
	this._highlightLayer.style.display = "none";
	if (this._lineLayer != null) {
		B.removeLayerDiv(this._lineLayer);
	}
	this._lineLayer = B.createLayerDiv(110, "timeline-band-lines");
	this._lineLayer.style.display = "none";
	if (this._eventLayer != null) {
		B.removeLayerDiv(this._eventLayer);
	}
	this._eventLayer = B.createLayerDiv(115, "timeline-band-events");
	this._eventLayer.style.display = "none";
};
Timeline.CompactEventPainter.prototype.paintEvent = function(B, C, D, A) {
	if (B.isInstant()) {
		this.paintInstantEvent(B, C, D, A);
	} else {
		this.paintDurationEvent(B, C, D, A);
	}
};
Timeline.CompactEventPainter.prototype.paintInstantEvent = function(B, C, D, A) {
	if (B.isImprecise()) {
		this.paintImpreciseInstantEvent(B, C, D, A);
	} else {
		this.paintPreciseInstantEvent(B, C, D, A);
	}
};
Timeline.CompactEventPainter.prototype.paintDurationEvent = function(B, C, D, A) {
	if (B.isImprecise()) {
		this.paintImpreciseDurationEvent(B, C, D, A);
	} else {
		this.paintPreciseDurationEvent(B, C, D, A);
	}
};
Timeline.CompactEventPainter.prototype.paintPreciseInstantEvent = function(H,
		F, B, A) {
	var C = {
		tooltip : H.getProperty("tooltip") || H.getText()
	};
	var E = {
		url : H.getIcon()
	};
	if (E.url == null) {
		E.url = F.defaultIcon;
		E.width = F.defaultIconWidth;
		E.height = F.defaultIconHeight;
		E.className = "timeline-event-icon-default";
	} else {
		E.width = H.getProperty("iconWidth") || F.customIconWidth;
		E.height = H.getProperty("iconHeight") || F.customIconHeight;
	}
	var J = {
		text : H.getText(),
		color : H.getTextColor() || H.getColor(),
		className : H.getClassName()
	};
	var G = this.paintTapeIconLabel(H.getStart(), C, null, E, J, F, B, A);
	var I = this;
	var D = function(L, K, M) {
		return I._onClickInstantEvent(G.iconElmtData.elmt, K, H);
	};
	SimileAjax.DOM.registerEvent(G.iconElmtData.elmt, "mousedown", D);
	SimileAjax.DOM.registerEvent(G.labelElmtData.elmt, "mousedown", D);
	this._eventIdToElmt[H.getID()] = G.iconElmtData.elmt;
};
Timeline.CompactEventPainter.prototype.paintCompositePreciseInstantEvents = function(
		J, H, D, B) {
	var K = J[0];
	var A = [];
	for ( var C = 0; C < J.length; C++) {
		A.push(J[C].getProperty("tooltip") || J[C].getText());
	}
	var E = {
		tooltip : A.join("; ")
	};
	var G = {
		url : H.compositeIcon,
		width : H.compositeIconWidth,
		height : H.compositeIconHeight,
		className : "timeline-event-icon-composite"
	};
	var M = {
		text : String.substitute(this._params.compositeEventLabelTemplate,
				[ J.length ])
	};
	var I = this.paintTapeIconLabel(K.getStart(), E, null, G, M, H, D, B);
	var L = this;
	var F = function(O, N, P) {
		return L._onClickMultiplePreciseInstantEvent(I.iconElmtData.elmt, N, J);
	};
	SimileAjax.DOM.registerEvent(I.iconElmtData.elmt, "mousedown", F);
	SimileAjax.DOM.registerEvent(I.labelElmtData.elmt, "mousedown", F);
	for ( var C = 0; C < J.length; C++) {
		this._eventIdToElmt[J[C].getID()] = I.iconElmtData.elmt;
	}
};
Timeline.CompactEventPainter.prototype.paintStackedPreciseInstantEvents = function(
		T, j, c, E) {
	var S = "limit" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.limit
			: 10;
	var G = "moreMessageTemplate" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.moreMessageTemplate
			: "%0 More Events";
	var Q = S <= T.length - 2;
	var B = this._band;
	var L = function(i) {
		return Math.round(B.dateToPixelOffset(i));
	};
	var O = function(i) {
		var r = {
			url : i.getIcon()
		};
		if (r.url == null) {
			r.url = j.defaultStackIcon;
			r.width = j.defaultStackIconWidth;
			r.height = j.defaultStackIconHeight;
			r.className = "timeline-event-icon-stack timeline-event-icon-default";
		} else {
			r.width = i.getProperty("iconWidth") || j.customIconWidth;
			r.height = i.getProperty("iconHeight") || j.customIconHeight;
			r.className = "timeline-event-icon-stack";
		}
		return r;
	};
	var C = O(T[0]);
	var V = 5;
	var D = 0;
	var g = 0;
	var p = 0;
	var U = 0;
	var l = [];
	for ( var n = 0; n < T.length && (!Q || n < S); n++) {
		var b = T[n];
		var a = b.getText();
		var X = O(b);
		var W = this._frc.computeSize(a);
		var K = {
			text : a,
			iconData : X,
			labelSize : W,
			iconLeft : C.width + n * V - X.width
		};
		K.labelLeft = C.width + n * V + j.iconLabelGap;
		K.top = p;
		l.push(K);
		D = Math.min(D, K.iconLeft);
		p += W.height;
		g = Math.max(g, K.labelLeft + W.width);
		U = Math.max(U, K.top + X.height);
	}
	if (Q) {
		var e = String.substitute(G, [ T.length - S ]);
		var H = this._frc.computeSize(e);
		var J = C.width + (S - 1) * V + j.iconLabelGap;
		var m = p;
		p += H.height;
		g = Math.max(g, J + H.width);
	}
	g += j.labelRightMargin;
	p += j.labelBottomMargin;
	U += j.iconBottomMargin;
	var F = L(T[0].getStart());
	var Y = [];
	var N = Math.ceil(Math.max(U, p) / j.trackHeight);
	var M = C.width + (T.length - 1) * V;
	for ( var n = 0; n < N; n++) {
		Y.push( {
			start : D,
			end : M
		});
	}
	var f = Math.ceil(p / j.trackHeight);
	for ( var n = 0; n < f; n++) {
		var P = Y[n];
		P.end = Math.max(P.end, g);
	}
	var k = this._fitTracks(F, Y);
	var Z = k * j.trackHeight + j.trackOffset;
	var q = this._timeline.getDocument().createElement("div");
	q.className = "timeline-event-icon-stack";
	q.style.position = "absolute";
	q.style.overflow = "visible";
	q.style.left = F + "px";
	q.style.top = Z + "px";
	q.style.width = M + "px";
	q.style.height = U + "px";
	q.innerHTML = "<div style='position: relative'></div>";
	this._eventLayer.appendChild(q);
	var I = this;
	var R = function(r) {
		try {
			var w = parseInt(this.getAttribute("index"));
			var u = q.firstChild.childNodes;
			for ( var s = 0; s < u.length; s++) {
				var v = u[s];
				if (s == w) {
					v.style.zIndex = u.length;
				} else {
					v.style.zIndex = u.length - s;
				}
			}
		} catch (t) {
		}
	};
	var d = function(u) {
		var w = l[u];
		var r = T[u];
		var i = r.getProperty("tooltip") || r.getText();
		var v = I
				._paintEventLabel( {
					tooltip : i
				}, {
					text : w.text
				}, F + w.labelLeft, Z + w.top, w.labelSize.width,
						w.labelSize.height, c);
		v.elmt.setAttribute("index", u);
		v.elmt.onmouseover = R;
		var t = SimileAjax.Graphics.createTranslucentImage(w.iconData.url);
		var s = I._timeline.getDocument().createElement("div");
		s.className = "timeline-event-icon"
				+ ("className" in w.iconData ? (" " + w.iconData.className)
						: "");
		s.style.left = w.iconLeft + "px";
		s.style.top = w.top + "px";
		s.style.zIndex = (l.length - u);
		s.appendChild(t);
		s.setAttribute("index", u);
		s.onmouseover = R;
		q.firstChild.appendChild(s);
		var x = function(z, y, AA) {
			return I._onClickInstantEvent(v.elmt, y, r);
		};
		SimileAjax.DOM.registerEvent(s, "mousedown", x);
		SimileAjax.DOM.registerEvent(v.elmt, "mousedown", x);
		I._eventIdToElmt[r.getID()] = s;
	};
	for ( var n = 0; n < l.length; n++) {
		d(n);
	}
	if (Q) {
		var o = T.slice(S);
		var A = this._paintEventLabel( {
			tooltip : e
		}, {
			text : e
		}, F + J, Z + m, H.width, H.height, c);
		var h = function(r, i, s) {
			return I._onClickMultiplePreciseInstantEvent(A.elmt, i, o);
		};
		SimileAjax.DOM.registerEvent(A.elmt, "mousedown", h);
		for ( var n = 0; n < o.length; n++) {
			this._eventIdToElmt[o[n].getID()] = A.elmt;
		}
	}
};
Timeline.CompactEventPainter.prototype.paintImpreciseInstantEvent = function(I,
		G, B, A) {
	var C = {
		tooltip : I.getProperty("tooltip") || I.getText()
	};
	var E = {
		start : I.getStart(),
		end : I.getEnd(),
		latestStart : I.getLatestStart(),
		earliestEnd : I.getEarliestEnd(),
		isInstant : true
	};
	var F = {
		url : I.getIcon()
	};
	if (F.url == null) {
		F = null;
	} else {
		F.width = I.getProperty("iconWidth") || G.customIconWidth;
		F.height = I.getProperty("iconHeight") || G.customIconHeight;
	}
	var K = {
		text : I.getText(),
		color : I.getTextColor() || I.getColor(),
		className : I.getClassName()
	};
	var H = this.paintTapeIconLabel(I.getStart(), C, E, F, K, G, B, A);
	var J = this;
	var D = F != null ? function(M, L, N) {
		return J._onClickInstantEvent(H.iconElmtData.elmt, L, I);
	} : function(M, L, N) {
		return J._onClickInstantEvent(H.labelElmtData.elmt, L, I);
	};
	SimileAjax.DOM.registerEvent(H.labelElmtData.elmt, "mousedown", D);
	SimileAjax.DOM.registerEvent(H.impreciseTapeElmtData.elmt, "mousedown", D);
	if (F != null) {
		SimileAjax.DOM.registerEvent(H.iconElmtData.elmt, "mousedown", D);
		this._eventIdToElmt[I.getID()] = H.iconElmtData.elmt;
	} else {
		this._eventIdToElmt[I.getID()] = H.labelElmtData.elmt;
	}
};
Timeline.CompactEventPainter.prototype.paintPreciseDurationEvent = function(I,
		G, B, A) {
	var C = {
		tooltip : I.getProperty("tooltip") || I.getText()
	};
	var E = {
		start : I.getStart(),
		end : I.getEnd(),
		isInstant : false
	};
	var F = {
		url : I.getIcon()
	};
	if (F.url == null) {
		F = null;
	} else {
		F.width = I.getProperty("iconWidth") || G.customIconWidth;
		F.height = I.getProperty("iconHeight") || G.customIconHeight;
	}
	var K = {
		text : I.getText(),
		color : I.getTextColor() || I.getColor(),
		className : I.getClassName()
	};
	var H = this.paintTapeIconLabel(I.getLatestStart(), C, E, F, K, G, B, A);
	var J = this;
	var D = F != null ? function(M, L, N) {
		return J._onClickInstantEvent(H.iconElmtData.elmt, L, I);
	} : function(M, L, N) {
		return J._onClickInstantEvent(H.labelElmtData.elmt, L, I);
	};
	SimileAjax.DOM.registerEvent(H.labelElmtData.elmt, "mousedown", D);
	SimileAjax.DOM.registerEvent(H.tapeElmtData.elmt, "mousedown", D);
	if (F != null) {
		SimileAjax.DOM.registerEvent(H.iconElmtData.elmt, "mousedown", D);
		this._eventIdToElmt[I.getID()] = H.iconElmtData.elmt;
	} else {
		this._eventIdToElmt[I.getID()] = H.labelElmtData.elmt;
	}
};
Timeline.CompactEventPainter.prototype.paintImpreciseDurationEvent = function(
		I, G, B, A) {
	var C = {
		tooltip : I.getProperty("tooltip") || I.getText()
	};
	var E = {
		start : I.getStart(),
		end : I.getEnd(),
		latestStart : I.getLatestStart(),
		earliestEnd : I.getEarliestEnd(),
		isInstant : false
	};
	var F = {
		url : I.getIcon()
	};
	if (F.url == null) {
		F = null;
	} else {
		F.width = I.getProperty("iconWidth") || G.customIconWidth;
		F.height = I.getProperty("iconHeight") || G.customIconHeight;
	}
	var K = {
		text : I.getText(),
		color : I.getTextColor() || I.getColor(),
		className : I.getClassName()
	};
	var H = this.paintTapeIconLabel(I.getLatestStart(), C, E, F, K, G, B, A);
	var J = this;
	var D = F != null ? function(M, L, N) {
		return J._onClickInstantEvent(H.iconElmtData.elmt, L, I);
	} : function(M, L, N) {
		return J._onClickInstantEvent(H.labelElmtData.elmt, L, I);
	};
	SimileAjax.DOM.registerEvent(H.labelElmtData.elmt, "mousedown", D);
	SimileAjax.DOM.registerEvent(H.tapeElmtData.elmt, "mousedown", D);
	if (F != null) {
		SimileAjax.DOM.registerEvent(H.iconElmtData.elmt, "mousedown", D);
		this._eventIdToElmt[I.getID()] = H.iconElmtData.elmt;
	} else {
		this._eventIdToElmt[I.getID()] = H.labelElmtData.elmt;
	}
};
Timeline.CompactEventPainter.prototype.paintTapeIconLabel = function(V, O, S,
		I, a, X, c, Z) {
	var R = this._band;
	var F = function(e) {
		return Math.round(R.dateToPixelOffset(e));
	};
	var d = F(V);
	var W = [];
	var b = 0;
	var B = 0;
	var C = 0;
	if (S != null) {
		b = X.tapeHeight + X.tapeBottomMargin;
		B = Math.ceil(X.tapeHeight / X.trackHeight);
		var A = F(S.end) - d;
		var L = F(S.start) - d;
		for ( var Q = 0; Q < B; Q++) {
			W.push( {
				start : L,
				end : A
			});
		}
		C = X.trackHeight - (b % X.tapeHeight);
	}
	var N = 0;
	var U = 0;
	if (I != null) {
		if ("iconAlign" in I && I.iconAlign == "center") {
			N = -Math.floor(I.width / 2);
		}
		U = N + I.width + X.iconLabelGap;
		if (B > 0) {
			W[B - 1].end = Math.max(W[B - 1].end, U);
		}
		var E = I.height + X.iconBottomMargin + C;
		while (E > 0) {
			W.push( {
				start : N,
				end : U
			});
			E -= X.trackHeight;
		}
	}
	var P = a.text;
	var H = this._frc.computeSize(P);
	var M = H.height + X.labelBottomMargin + C;
	var J = U + H.width + X.labelRightMargin;
	if (B > 0) {
		W[B - 1].end = Math.max(W[B - 1].end, J);
	}
	for ( var Y = 0; M > 0; Y++) {
		if (B + Y < W.length) {
			var T = W[B + Y];
			T.end = J;
		} else {
			W.push( {
				start : 0,
				end : J
			});
		}
		M -= X.trackHeight;
	}
	var G = this._fitTracks(d, W);
	var K = G * X.trackHeight + X.trackOffset;
	var D = {};
	D.labelElmtData = this._paintEventLabel(O, a, d + U, K + b, H.width,
			H.height, c);
	if (S != null) {
		if ("latestStart" in S || "earliestEnd" in S) {
			D.impreciseTapeElmtData = this._paintEventTape(O, S, X.tapeHeight,
					K, F(S.start), F(S.end), c.event.duration.impreciseColor,
					c.event.duration.impreciseOpacity, X, c);
		}
		if (!S.isInstant && "start" in S && "end" in S) {
			D.tapeElmtData = this._paintEventTape(O, S, X.tapeHeight, K, d,
					F("earliestEnd" in S ? S.earliestEnd : S.end), S.color,
					100, X, c);
		}
	}
	if (I != null) {
		D.iconElmtData = this._paintEventIcon(O, I, K + b, d + N, X, c);
	}
	return D;
};
Timeline.CompactEventPainter.prototype._fitTracks = function(F, C) {
	var H;
	for (H = 0; H < this._tracks.length; H++) {
		var E = true;
		for ( var B = 0; B < C.length && (H + B) < this._tracks.length; B++) {
			var G = this._tracks[H + B];
			var A = C[B];
			if (F + A.start < G) {
				E = false;
				break;
			}
		}
		if (E) {
			break;
		}
	}
	for ( var D = 0; D < C.length; D++) {
		this._tracks[H + D] = F + C[D].end;
	}
	return H;
};
Timeline.CompactEventPainter.prototype._paintEventIcon = function(C, D, H, G,
		E, F) {
	var B = SimileAjax.Graphics.createTranslucentImage(D.url);
	var A = this._timeline.getDocument().createElement("div");
	A.className = "timeline-event-icon"
			+ ("className" in D ? (" " + D.className) : "");
	A.style.left = G + "px";
	A.style.top = H + "px";
	A.appendChild(B);
	if ("tooltip" in C && typeof C.tooltip == "string") {
		A.title = C.tooltip;
	}
	this._eventLayer.appendChild(A);
	return {
		left : G,
		top : H,
		width : E.iconWidth,
		height : E.iconHeight,
		elmt : A
	};
};
Timeline.CompactEventPainter.prototype._paintEventLabel = function(E, I, C, F,
		A, G, D) {
	var H = this._timeline.getDocument();
	var B = H.createElement("div");
	B.className = "timeline-event-label";
	B.style.left = C + "px";
	B.style.width = (A + 1) + "px";
	B.style.top = F + "px";
	B.innerHTML = I.text;
	if ("tooltip" in E && typeof E.tooltip == "string") {
		B.title = E.tooltip;
	}
	if ("color" in I && typeof I.color == "string") {
		B.style.color = I.color;
	}
	if ("className" in I && typeof I.className == "string") {
		B.className += " " + I.className;
	}
	this._eventLayer.appendChild(B);
	return {
		left : C,
		top : F,
		width : A,
		height : G,
		elmt : B
	};
};
Timeline.CompactEventPainter.prototype._paintEventTape = function(G, H, K, J,
		D, A, E, C, I, F) {
	var B = A - D;
	var L = this._timeline.getDocument().createElement("div");
	L.className = "timeline-event-tape";
	L.style.left = D + "px";
	L.style.top = J + "px";
	L.style.width = B + "px";
	L.style.height = K + "px";
	if ("tooltip" in G && typeof G.tooltip == "string") {
		L.title = G.tooltip;
	}
	if (E != null && typeof H.color == "string") {
		L.style.backgroundColor = E;
	}
	if ("backgroundImage" in H && typeof H.backgroundImage == "string") {
		L.style.backgroundImage = "url(" + backgroundImage + ")";
		L.style.backgroundRepeat = ("backgroundRepeat" in H && typeof H.backgroundRepeat == "string") ? H.backgroundRepeat
				: "repeat";
	}
	SimileAjax.Graphics.setOpacity(L, C);
	if ("className" in H && typeof H.className == "string") {
		L.className += " " + H.className;
	}
	this._eventLayer.appendChild(L);
	return {
		left : D,
		top : J,
		width : B,
		height : K,
		elmt : L
	};
};
Timeline.CompactEventPainter.prototype._createHighlightDiv = function(A, C, E) {
	if (A >= 0) {
		var D = this._timeline.getDocument();
		var G = E.event;
		var B = G.highlightColors[Math.min(A, G.highlightColors.length - 1)];
		var F = D.createElement("div");
		F.style.position = "absolute";
		F.style.overflow = "hidden";
		F.style.left = (C.left - 2) + "px";
		F.style.width = (C.width + 4) + "px";
		F.style.top = (C.top - 2) + "px";
		F.style.height = (C.height + 4) + "px";
		this._highlightLayer.appendChild(F);
	}
};
Timeline.CompactEventPainter.prototype._onClickMultiplePreciseInstantEvent = function(
		E, A, B) {
	var F = SimileAjax.DOM.getPageCoordinates(E);
	this._showBubble(F.left + Math.ceil(E.offsetWidth / 2), F.top
			+ Math.ceil(E.offsetHeight / 2), B);
	var D = [];
	for ( var C = 0; C < B.length; C++) {
		D.push(B[C].getID());
	}
	this._fireOnSelect(D);
	A.cancelBubble = true;
	SimileAjax.DOM.cancelEvent(A);
	return false;
};
Timeline.CompactEventPainter.prototype._onClickInstantEvent = function(C, A, B) {
	var D = SimileAjax.DOM.getPageCoordinates(C);
	this._showBubble(D.left + Math.ceil(C.offsetWidth / 2), D.top
			+ Math.ceil(C.offsetHeight / 2), [ B ]);
	this._fireOnSelect( [ B.getID() ]);
	A.cancelBubble = true;
	SimileAjax.DOM.cancelEvent(A);
	return false;
};
Timeline.CompactEventPainter.prototype._onClickDurationEvent = function(F, B, C) {
	if ("pageX" in B) {
		var A = B.pageX;
		var E = B.pageY;
	} else {
		var D = SimileAjax.DOM.getPageCoordinates(F);
		var A = B.offsetX + D.left;
		var E = B.offsetY + D.top;
	}
	this._showBubble(A, E, [ C ]);
	this._fireOnSelect( [ C.getID() ]);
	B.cancelBubble = true;
	SimileAjax.DOM.cancelEvent(B);
	return false;
};
Timeline.CompactEventPainter.prototype.showBubble = function(A) {
	var B = this._eventIdToElmt[A.getID()];
	if (B) {
		var C = SimileAjax.DOM.getPageCoordinates(B);
		this._showBubble(C.left + B.offsetWidth / 2,
				C.top + B.offsetHeight / 2, [ A ]);
	}
};
Timeline.CompactEventPainter.prototype._showBubble = function(A, F, B) {
	var E = document.createElement("div");
	B = ("fillInfoBubble" in B) ? [ B ] : B;
	for ( var D = 0; D < B.length; D++) {
		var C = document.createElement("div");
		E.appendChild(C);
		B[D].fillInfoBubble(C, this._params.theme, this._band.getLabeller());
	}
	SimileAjax.WindowManager.cancelPopups();
	SimileAjax.Graphics.createBubbleForContentAndPoint(E, A, F,
			this._params.theme.event.bubble.width);
};
Timeline.CompactEventPainter.prototype._fireOnSelect = function(B) {
	for ( var A = 0; A < this._onSelectListeners.length; A++) {
		this._onSelectListeners[A](B);
	}
};

/* decorators.js */
Timeline.SpanHighlightDecorator = function(A) {
	this._unit = A.unit != null ? A.unit : SimileAjax.NativeDateUnit;
	this._startDate = (typeof A.startDate == "string") ? this._unit
			.parseFromObject(A.startDate) : A.startDate;
	this._endDate = (typeof A.endDate == "string") ? this._unit
			.parseFromObject(A.endDate) : A.endDate;
	this._startLabel = A.startLabel != null ? A.startLabel : "";
	this._endLabel = A.endLabel != null ? A.endLabel : "";
	this._color = A.color;
	this._cssClass = A.cssClass != null ? A.cssClass : null;
	this._opacity = A.opacity != null ? A.opacity : 100;
	this._zIndex = (A.inFront != null && A.inFront) ? 113 : 10;
};
Timeline.SpanHighlightDecorator.prototype.initialize = function(B, A) {
	this._band = B;
	this._timeline = A;
	this._layerDiv = null;
};
Timeline.SpanHighlightDecorator.prototype.paint = function() {
	if (this._layerDiv != null) {
		this._band.removeLayerDiv(this._layerDiv);
	}
	this._layerDiv = this._band.createLayerDiv(this._zIndex);
	this._layerDiv.setAttribute("name", "span-highlight-decorator");
	this._layerDiv.style.display = "none";
	var E = this._band.getMinDate();
	var A = this._band.getMaxDate();
	if (this._unit.compare(this._startDate, A) < 0
			&& this._unit.compare(this._endDate, E) > 0) {
		E = this._unit.later(E, this._startDate);
		A = this._unit.earlier(A, this._endDate);
		var F = this._band.dateToPixelOffset(E);
		var I = this._band.dateToPixelOffset(A);
		var H = this._timeline.getDocument();
		var K = function() {
			var L = H.createElement("table");
			L.insertRow(0).insertCell(0);
			return L;
		};
		var B = H.createElement("div");
		B.className = "timeline-highlight-decorator";
		if (this._cssClass) {
			B.className += " " + this._cssClass;
		}
		if (this._color != null) {
			B.style.backgroundColor = this._color;
		}
		if (this._opacity < 100) {
			SimileAjax.Graphics.setOpacity(B, this._opacity);
		}
		this._layerDiv.appendChild(B);
		var J = K();
		J.className = "timeline-highlight-label timeline-highlight-label-start";
		var C = J.rows[0].cells[0];
		C.innerHTML = this._startLabel;
		if (this._cssClass) {
			C.className = "label_" + this._cssClass;
		}
		this._layerDiv.appendChild(J);
		var G = K();
		G.className = "timeline-highlight-label timeline-highlight-label-end";
		var D = G.rows[0].cells[0];
		D.innerHTML = this._endLabel;
		if (this._cssClass) {
			D.className = "label_" + this._cssClass;
		}
		this._layerDiv.appendChild(G);
		if (this._timeline.isHorizontal()) {
			B.style.left = F + "px";
			B.style.width = (I - F) + "px";
			J.style.right = (this._band.getTotalViewLength() - F) + "px";
			J.style.width = (this._startLabel.length) + "em";
			G.style.left = I + "px";
			G.style.width = (this._endLabel.length) + "em";
		} else {
			B.style.top = F + "px";
			B.style.height = (I - F) + "px";
			J.style.bottom = F + "px";
			J.style.height = "1.5px";
			G.style.top = I + "px";
			G.style.height = "1.5px";
		}
	}
	this._layerDiv.style.display = "block";
};
Timeline.SpanHighlightDecorator.prototype.softPaint = function() {
};
Timeline.PointHighlightDecorator = function(A) {
	this._unit = A.unit != null ? A.unit : SimileAjax.NativeDateUnit;
	this._date = (typeof A.date == "string") ? this._unit
			.parseFromObject(A.date) : A.date;
	this._width = A.width != null ? A.width : 10;
	this._color = A.color;
	this._cssClass = A.cssClass != null ? A.cssClass : "";
	this._opacity = A.opacity != null ? A.opacity : 100;
};
Timeline.PointHighlightDecorator.prototype.initialize = function(B, A) {
	this._band = B;
	this._timeline = A;
	this._layerDiv = null;
};
Timeline.PointHighlightDecorator.prototype.paint = function() {
	if (this._layerDiv != null) {
		this._band.removeLayerDiv(this._layerDiv);
	}
	this._layerDiv = this._band.createLayerDiv(10);
	this._layerDiv.setAttribute("name", "span-highlight-decorator");
	this._layerDiv.style.display = "none";
	var C = this._band.getMinDate();
	var E = this._band.getMaxDate();
	if (this._unit.compare(this._date, E) < 0
			&& this._unit.compare(this._date, C) > 0) {
		var A = this._band.dateToPixelOffset(this._date);
		var B = A - Math.round(this._width / 2);
		var D = this._timeline.getDocument();
		var F = D.createElement("div");
		F.className = "timeline-highlight-point-decorator";
		F.className += " " + this._cssClass;
		if (this._color != null) {
			F.style.backgroundColor = this._color;
		}
		if (this._opacity < 100) {
			SimileAjax.Graphics.setOpacity(F, this._opacity);
		}
		this._layerDiv.appendChild(F);
		if (this._timeline.isHorizontal()) {
			F.style.left = B + "px";
			F.style.width = this._width;
		} else {
			F.style.top = B + "px";
			F.style.height = this._width;
		}
	}
	this._layerDiv.style.display = "block";
};
Timeline.PointHighlightDecorator.prototype.softPaint = function() {
};

/* detailed-painter.js */
Timeline.DetailedEventPainter = function(A) {
	this._params = A;
	this._onSelectListeners = [];
	this._filterMatcher = null;
	this._highlightMatcher = null;
	this._frc = null;
	this._eventIdToElmt = {};
};
Timeline.DetailedEventPainter.prototype.initialize = function(B, A) {
	this._band = B;
	this._timeline = A;
	this._backLayer = null;
	this._eventLayer = null;
	this._lineLayer = null;
	this._highlightLayer = null;
	this._eventIdToElmt = null;
};
Timeline.DetailedEventPainter.prototype.getType = function() {
	return "detailed";
};
Timeline.DetailedEventPainter.prototype.addOnSelectListener = function(A) {
	this._onSelectListeners.push(A);
};
Timeline.DetailedEventPainter.prototype.removeOnSelectListener = function(B) {
	for ( var A = 0; A < this._onSelectListeners.length; A++) {
		if (this._onSelectListeners[A] == B) {
			this._onSelectListeners.splice(A, 1);
			break;
		}
	}
};
Timeline.DetailedEventPainter.prototype.getFilterMatcher = function() {
	return this._filterMatcher;
};
Timeline.DetailedEventPainter.prototype.setFilterMatcher = function(A) {
	this._filterMatcher = A;
};
Timeline.DetailedEventPainter.prototype.getHighlightMatcher = function() {
	return this._highlightMatcher;
};
Timeline.DetailedEventPainter.prototype.setHighlightMatcher = function(A) {
	this._highlightMatcher = A;
};
Timeline.DetailedEventPainter.prototype.paint = function() {
	var C = this._band.getEventSource();
	if (C == null) {
		return;
	}
	this._eventIdToElmt = {};
	this._prepareForPainting();
	var I = this._params.theme.event;
	var G = Math.max(I.track.height, this._frc.getLineHeight());
	var F = {
		trackOffset : Math.round(this._band.getViewWidth() / 2 - G / 2),
		trackHeight : G,
		trackGap : I.track.gap,
		trackIncrement : G + I.track.gap,
		icon : I.instant.icon,
		iconWidth : I.instant.iconWidth,
		iconHeight : I.instant.iconHeight,
		labelWidth : I.label.width
	};
	var D = this._band.getMinDate();
	var B = this._band.getMaxDate();
	var J = (this._filterMatcher != null) ? this._filterMatcher : function(K) {
		return true;
	};
	var A = (this._highlightMatcher != null) ? this._highlightMatcher
			: function(K) {
				return -1;
			};
	var E = C.getEventReverseIterator(D, B);
	while (E.hasNext()) {
		var H = E.next();
		if (J(H)) {
			this.paintEvent(H, F, this._params.theme, A(H));
		}
	}
	this._highlightLayer.style.display = "block";
	this._lineLayer.style.display = "block";
	this._eventLayer.style.display = "block";
	this._band.updateEventTrackInfo(this._lowerTracks.length
			+ this._upperTracks.length, F.trackIncrement);
};
Timeline.DetailedEventPainter.prototype.softPaint = function() {
};
Timeline.DetailedEventPainter.prototype._prepareForPainting = function() {
	var B = this._band;
	if (this._backLayer == null) {
		this._backLayer = this._band.createLayerDiv(0, "timeline-band-events");
		this._backLayer.style.visibility = "hidden";
		var A = document.createElement("span");
		A.className = "timeline-event-label";
		this._backLayer.appendChild(A);
		this._frc = SimileAjax.Graphics.getFontRenderingContext(A);
	}
	this._frc.update();
	this._lowerTracks = [];
	this._upperTracks = [];
	if (this._highlightLayer != null) {
		B.removeLayerDiv(this._highlightLayer);
	}
	this._highlightLayer = B.createLayerDiv(105, "timeline-band-highlights");
	this._highlightLayer.style.display = "none";
	if (this._lineLayer != null) {
		B.removeLayerDiv(this._lineLayer);
	}
	this._lineLayer = B.createLayerDiv(110, "timeline-band-lines");
	this._lineLayer.style.display = "none";
	if (this._eventLayer != null) {
		B.removeLayerDiv(this._eventLayer);
	}
	this._eventLayer = B.createLayerDiv(110, "timeline-band-events");
	this._eventLayer.style.display = "none";
};
Timeline.DetailedEventPainter.prototype.paintEvent = function(B, C, D, A) {
	if (B.isInstant()) {
		this.paintInstantEvent(B, C, D, A);
	} else {
		this.paintDurationEvent(B, C, D, A);
	}
};
Timeline.DetailedEventPainter.prototype.paintInstantEvent = function(B, C, D, A) {
	if (B.isImprecise()) {
		this.paintImpreciseInstantEvent(B, C, D, A);
	} else {
		this.paintPreciseInstantEvent(B, C, D, A);
	}
};
Timeline.DetailedEventPainter.prototype.paintDurationEvent = function(B, C, D,
		A) {
	if (B.isImprecise()) {
		this.paintImpreciseDurationEvent(B, C, D, A);
	} else {
		this.paintPreciseDurationEvent(B, C, D, A);
	}
};
Timeline.DetailedEventPainter.prototype.paintPreciseInstantEvent = function(L,
		P, S, Q) {
	var T = this._timeline.getDocument();
	var J = L.getText();
	var G = L.getStart();
	var H = Math.round(this._band.dateToPixelOffset(G));
	var A = Math.round(H + P.iconWidth / 2);
	var C = Math.round(H - P.iconWidth / 2);
	var E = this._frc.computeSize(J);
	var F = this._findFreeTrackForSolid(A, H);
	var B = this._paintEventIcon(L, F, C, P, S);
	var K = A + S.event.label.offsetFromLine;
	var O = F;
	var D = this._getTrackData(F);
	if (Math.min(D.solid, D.text) >= K + E.width) {
		D.solid = C;
		D.text = K;
	} else {
		D.solid = C;
		K = H + S.event.label.offsetFromLine;
		O = this._findFreeTrackForText(F, K + E.width, function(U) {
			U.line = H - 2;
		});
		this._getTrackData(O).text = C;
		this._paintEventLine(L, H, F, O, P, S);
	}
	var N = Math.round(P.trackOffset + O * P.trackIncrement + P.trackHeight / 2
			- E.height / 2);
	var R = this._paintEventLabel(L, J, K, N, E.width, E.height, S);
	var M = this;
	var I = function(V, U, W) {
		return M._onClickInstantEvent(B.elmt, U, L);
	};
	SimileAjax.DOM.registerEvent(B.elmt, "mousedown", I);
	SimileAjax.DOM.registerEvent(R.elmt, "mousedown", I);
	this._createHighlightDiv(Q, B, S);
	this._eventIdToElmt[L.getID()] = B.elmt;
};
Timeline.DetailedEventPainter.prototype.paintImpreciseInstantEvent = function(
		O, S, W, T) {
	var X = this._timeline.getDocument();
	var M = O.getText();
	var I = O.getStart();
	var U = O.getEnd();
	var K = Math.round(this._band.dateToPixelOffset(I));
	var B = Math.round(this._band.dateToPixelOffset(U));
	var A = Math.round(K + S.iconWidth / 2);
	var D = Math.round(K - S.iconWidth / 2);
	var G = this._frc.computeSize(M);
	var H = this._findFreeTrackForSolid(B, K);
	var E = this._paintEventTape(O, H, K, B, W.event.instant.impreciseColor,
			W.event.instant.impreciseOpacity, S, W);
	var C = this._paintEventIcon(O, H, D, S, W);
	var F = this._getTrackData(H);
	F.solid = D;
	var N = A + W.event.label.offsetFromLine;
	var J = N + G.width;
	var R;
	if (J < B) {
		R = H;
	} else {
		N = K + W.event.label.offsetFromLine;
		J = N + G.width;
		R = this._findFreeTrackForText(H, J, function(Y) {
			Y.line = K - 2;
		});
		this._getTrackData(R).text = D;
		this._paintEventLine(O, K, H, R, S, W);
	}
	var Q = Math.round(S.trackOffset + R * S.trackIncrement + S.trackHeight / 2
			- G.height / 2);
	var V = this._paintEventLabel(O, M, N, Q, G.width, G.height, W);
	var P = this;
	var L = function(Z, Y, a) {
		return P._onClickInstantEvent(C.elmt, Y, O);
	};
	SimileAjax.DOM.registerEvent(C.elmt, "mousedown", L);
	SimileAjax.DOM.registerEvent(E.elmt, "mousedown", L);
	SimileAjax.DOM.registerEvent(V.elmt, "mousedown", L);
	this._createHighlightDiv(T, C, W);
	this._eventIdToElmt[O.getID()] = C.elmt;
};
Timeline.DetailedEventPainter.prototype.paintPreciseDurationEvent = function(K,
		O, T, Q) {
	var U = this._timeline.getDocument();
	var I = K.getText();
	var E = K.getStart();
	var R = K.getEnd();
	var F = Math.round(this._band.dateToPixelOffset(E));
	var A = Math.round(this._band.dateToPixelOffset(R));
	var C = this._frc.computeSize(I);
	var D = this._findFreeTrackForSolid(A);
	var P = K.getColor();
	P = P != null ? P : T.event.duration.color;
	var B = this._paintEventTape(K, D, F, A, P, 100, O, T);
	var H = this._getTrackData(D);
	H.solid = F;
	var J = F + T.event.label.offsetFromLine;
	var N = this._findFreeTrackForText(D, J + C.width, function(V) {
		V.line = F - 2;
	});
	this._getTrackData(N).text = F - 2;
	this._paintEventLine(K, F, D, N, O, T);
	var M = Math.round(O.trackOffset + N * O.trackIncrement + O.trackHeight / 2
			- C.height / 2);
	var S = this._paintEventLabel(K, I, J, M, C.width, C.height, T);
	var L = this;
	var G = function(W, V, X) {
		return L._onClickDurationEvent(B.elmt, V, K);
	};
	SimileAjax.DOM.registerEvent(B.elmt, "mousedown", G);
	SimileAjax.DOM.registerEvent(S.elmt, "mousedown", G);
	this._createHighlightDiv(Q, B, T);
	this._eventIdToElmt[K.getID()] = B.elmt;
};
Timeline.DetailedEventPainter.prototype.paintImpreciseDurationEvent = function(
		M, T, Y, V) {
	var Z = this._timeline.getDocument();
	var K = M.getText();
	var G = M.getStart();
	var S = M.getLatestStart();
	var W = M.getEnd();
	var O = M.getEarliestEnd();
	var H = Math.round(this._band.dateToPixelOffset(G));
	var E = Math.round(this._band.dateToPixelOffset(S));
	var A = Math.round(this._band.dateToPixelOffset(W));
	var F = Math.round(this._band.dateToPixelOffset(O));
	var C = this._frc.computeSize(K);
	var D = this._findFreeTrackForSolid(A);
	var U = M.getColor();
	U = U != null ? U : Y.event.duration.color;
	var R = this._paintEventTape(M, D, H, A, Y.event.duration.impreciseColor,
			Y.event.duration.impreciseOpacity, T, Y);
	var B = this._paintEventTape(M, D, E, F, U, 100, T, Y);
	var J = this._getTrackData(D);
	J.solid = H;
	var L = E + Y.event.label.offsetFromLine;
	var Q = this._findFreeTrackForText(D, L + C.width, function(a) {
		a.line = E - 2;
	});
	this._getTrackData(Q).text = E - 2;
	this._paintEventLine(M, E, D, Q, T, Y);
	var P = Math.round(T.trackOffset + Q * T.trackIncrement + T.trackHeight / 2
			- C.height / 2);
	var X = this._paintEventLabel(M, K, L, P, C.width, C.height, Y);
	var N = this;
	var I = function(b, a, c) {
		return N._onClickDurationEvent(B.elmt, a, M);
	};
	SimileAjax.DOM.registerEvent(B.elmt, "mousedown", I);
	SimileAjax.DOM.registerEvent(X.elmt, "mousedown", I);
	this._createHighlightDiv(V, B, Y);
	this._eventIdToElmt[M.getID()] = B.elmt;
};
Timeline.DetailedEventPainter.prototype._findFreeTrackForSolid = function(D, A) {
	for ( var C = 0; true; C++) {
		if (C < this._lowerTracks.length) {
			var B = this._lowerTracks[C];
			if (Math.min(B.solid, B.text) > D && (!(A) || B.line > A)) {
				return C;
			}
		} else {
			this._lowerTracks.push( {
				solid : Number.POSITIVE_INFINITY,
				text : Number.POSITIVE_INFINITY,
				line : Number.POSITIVE_INFINITY
			});
			return C;
		}
		if (C < this._upperTracks.length) {
			var B = this._upperTracks[C];
			if (Math.min(B.solid, B.text) > D && (!(A) || B.line > A)) {
				return -1 - C;
			}
		} else {
			this._upperTracks.push( {
				solid : Number.POSITIVE_INFINITY,
				text : Number.POSITIVE_INFINITY,
				line : Number.POSITIVE_INFINITY
			});
			return -1 - C;
		}
	}
};
Timeline.DetailedEventPainter.prototype._findFreeTrackForText = function(C, A,
		I) {
	var B;
	var E;
	var F;
	var H;
	if (C < 0) {
		B = true;
		F = -C;
		E = this._findFreeUpperTrackForText(F, A);
		H = -1 - E;
	} else {
		if (C > 0) {
			B = false;
			F = C + 1;
			E = this._findFreeLowerTrackForText(F, A);
			H = E;
		} else {
			var G = this._findFreeUpperTrackForText(0, A);
			var J = this._findFreeLowerTrackForText(1, A);
			if (J - 1 <= G) {
				B = false;
				F = 1;
				E = J;
				H = E;
			} else {
				B = true;
				F = 0;
				E = G;
				H = -1 - E;
			}
		}
	}
	if (B) {
		if (E == this._upperTracks.length) {
			this._upperTracks.push( {
				solid : Number.POSITIVE_INFINITY,
				text : Number.POSITIVE_INFINITY,
				line : Number.POSITIVE_INFINITY
			});
		}
		for ( var D = F; D < E; D++) {
			I(this._upperTracks[D]);
		}
	} else {
		if (E == this._lowerTracks.length) {
			this._lowerTracks.push( {
				solid : Number.POSITIVE_INFINITY,
				text : Number.POSITIVE_INFINITY,
				line : Number.POSITIVE_INFINITY
			});
		}
		for ( var D = F; D < E; D++) {
			I(this._lowerTracks[D]);
		}
	}
	return H;
};
Timeline.DetailedEventPainter.prototype._findFreeLowerTrackForText = function(
		A, C) {
	for (; A < this._lowerTracks.length; A++) {
		var B = this._lowerTracks[A];
		if (Math.min(B.solid, B.text) >= C) {
			break;
		}
	}
	return A;
};
Timeline.DetailedEventPainter.prototype._findFreeUpperTrackForText = function(
		A, C) {
	for (; A < this._upperTracks.length; A++) {
		var B = this._upperTracks[A];
		if (Math.min(B.solid, B.text) >= C) {
			break;
		}
	}
	return A;
};
Timeline.DetailedEventPainter.prototype._getTrackData = function(A) {
	return (A < 0) ? this._upperTracks[-A - 1] : this._lowerTracks[A];
};
Timeline.DetailedEventPainter.prototype._paintEventLine = function(J, E, D, A,
		G, F) {
	var H = Math
			.round(G.trackOffset + D * G.trackIncrement + G.trackHeight / 2);
	var I = Math.round(Math.abs(A - D) * G.trackIncrement);
	var C = "1px solid " + F.event.label.lineColor;
	var B = this._timeline.getDocument().createElement("div");
	B.style.position = "absolute";
	B.style.left = E + "px";
	B.style.width = F.event.label.offsetFromLine + "px";
	B.style.height = I + "px";
	if (D > A) {
		B.style.top = (H - I) + "px";
		B.style.borderTop = C;
	} else {
		B.style.top = H + "px";
		B.style.borderBottom = C;
	}
	B.style.borderLeft = C;
	this._lineLayer.appendChild(B);
};
Timeline.DetailedEventPainter.prototype._paintEventIcon = function(J, B, C, F,
		E) {
	var H = J.getIcon();
	H = H != null ? H : F.icon;
	var G = F.trackOffset + B * F.trackIncrement + F.trackHeight / 2;
	var I = Math.round(G - F.iconHeight / 2);
	var D = SimileAjax.Graphics.createTranslucentImage(H);
	var A = this._timeline.getDocument().createElement("div");
	A.style.position = "absolute";
	A.style.left = C + "px";
	A.style.top = I + "px";
	A.appendChild(D);
	A.style.cursor = "pointer";
	if (J._title != null) {
		A.title = J._title;
	}
	this._eventLayer.appendChild(A);
	return {
		left : C,
		top : I,
		width : F.iconWidth,
		height : F.iconHeight,
		elmt : A
	};
};
Timeline.DetailedEventPainter.prototype._paintEventLabel = function(I, J, C, F,
		A, G, E) {
	var H = this._timeline.getDocument();
	var K = H.createElement("div");
	K.style.position = "absolute";
	K.style.left = C + "px";
	K.style.width = A + "px";
	K.style.top = F + "px";
	K.style.height = G + "px";
	K.style.backgroundColor = E.event.label.backgroundColor;
	SimileAjax.Graphics.setOpacity(K, E.event.label.backgroundOpacity);
	this._eventLayer.appendChild(K);
	var B = H.createElement("div");
	B.style.position = "absolute";
	B.style.left = C + "px";
	B.style.width = A + "px";
	B.style.top = F + "px";
	B.innerHTML = J;
	B.style.cursor = "pointer";
	if (I._title != null) {
		B.title = I._title;
	}
	var D = I.getTextColor();
	if (D == null) {
		D = I.getColor();
	}
	if (D != null) {
		B.style.color = D;
	}
	this._eventLayer.appendChild(B);
	return {
		left : C,
		top : F,
		width : A,
		height : G,
		elmt : B
	};
};
Timeline.DetailedEventPainter.prototype._paintEventTape = function(L, B, D, A,
		G, C, I, H) {
	var F = A - D;
	var E = H.event.tape.height;
	var K = I.trackOffset + B * I.trackIncrement + I.trackHeight / 2;
	var J = Math.round(K - E / 2);
	var M = this._timeline.getDocument().createElement("div");
	M.style.position = "absolute";
	M.style.left = D + "px";
	M.style.width = F + "px";
	M.style.top = J + "px";
	M.style.height = E + "px";
	M.style.backgroundColor = G;
	M.style.overflow = "hidden";
	M.style.cursor = "pointer";
	if (L._title != null) {
		M.title = L._title;
	}
	SimileAjax.Graphics.setOpacity(M, C);
	this._eventLayer.appendChild(M);
	return {
		left : D,
		top : J,
		width : F,
		height : E,
		elmt : M
	};
};
Timeline.DetailedEventPainter.prototype._createHighlightDiv = function(A, C, E) {
	if (A >= 0) {
		var D = this._timeline.getDocument();
		var G = E.event;
		var B = G.highlightColors[Math.min(A, G.highlightColors.length - 1)];
		var F = D.createElement("div");
		F.style.position = "absolute";
		F.style.overflow = "hidden";
		F.style.left = (C.left - 2) + "px";
		F.style.width = (C.width + 4) + "px";
		F.style.top = (C.top - 2) + "px";
		F.style.height = (C.height + 4) + "px";
		F.style.background = B;
		this._highlightLayer.appendChild(F);
	}
};
Timeline.DetailedEventPainter.prototype._onClickInstantEvent = function(C, A, B) {
	var D = SimileAjax.DOM.getPageCoordinates(C);
	this._showBubble(D.left + Math.ceil(C.offsetWidth / 2), D.top
			+ Math.ceil(C.offsetHeight / 2), B);
	this._fireOnSelect(B.getID());
	A.cancelBubble = true;
	SimileAjax.DOM.cancelEvent(A);
	return false;
};
Timeline.DetailedEventPainter.prototype._onClickDurationEvent = function(F, B,
		C) {
	if ("pageX" in B) {
		var A = B.pageX;
		var E = B.pageY;
	} else {
		var D = SimileAjax.DOM.getPageCoordinates(F);
		var A = B.offsetX + D.left;
		var E = B.offsetY + D.top;
	}
	this._showBubble(A, E, C);
	this._fireOnSelect(C.getID());
	B.cancelBubble = true;
	SimileAjax.DOM.cancelEvent(B);
	return false;
};
Timeline.DetailedEventPainter.prototype.showBubble = function(A) {
	var B = this._eventIdToElmt[A.getID()];
	if (B) {
		var C = SimileAjax.DOM.getPageCoordinates(B);
		this._showBubble(C.left + B.offsetWidth / 2,
				C.top + B.offsetHeight / 2, A);
	}
};
Timeline.DetailedEventPainter.prototype._showBubble = function(B, E, C) {
	var D = document.createElement("div");
	var A = this._params.theme.event.bubble;
	C.fillInfoBubble(D, this._params.theme, this._band.getLabeller());
	SimileAjax.WindowManager.cancelPopups();
	SimileAjax.Graphics.createBubbleForContentAndPoint(D, B, E, A.width, null,
			A.maxHeight);
};
Timeline.DetailedEventPainter.prototype._fireOnSelect = function(A) {
	for ( var B = 0; B < this._onSelectListeners.length; B++) {
		this._onSelectListeners[B](A);
	}
};

/* ether-painters.js */
Timeline.GregorianEtherPainter = function(A) {
	this._params = A;
	this._theme = A.theme;
	this._unit = A.unit;
	this._multiple = ("multiple" in A) ? A.multiple : 1;
};
Timeline.GregorianEtherPainter.prototype.initialize = function(C, B) {
	this._band = C;
	this._timeline = B;
	this._backgroundLayer = C.createLayerDiv(0);
	this._backgroundLayer.setAttribute("name", "ether-background");
	this._backgroundLayer.className = "timeline-ether-bg";
	this._markerLayer = null;
	this._lineLayer = null;
	var D = ("align" in this._params && this._params.align != undefined) ? this._params.align
			: this._theme.ether.interval.marker[B.isHorizontal() ? "hAlign"
					: "vAlign"];
	var A = ("showLine" in this._params) ? this._params.showLine
			: this._theme.ether.interval.line.show;
	this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(
			this._timeline, this._band, this._theme, D, A);
	this._highlight = new Timeline.EtherHighlight(this._timeline, this._band,
			this._theme, this._backgroundLayer);
};
Timeline.GregorianEtherPainter.prototype.setHighlight = function(A, B) {
	this._highlight.position(A, B);
};
Timeline.GregorianEtherPainter.prototype.paint = function() {
	if (this._markerLayer) {
		this._band.removeLayerDiv(this._markerLayer);
	}
	this._markerLayer = this._band.createLayerDiv(100);
	this._markerLayer.setAttribute("name", "ether-markers");
	this._markerLayer.style.display = "none";
	if (this._lineLayer) {
		this._band.removeLayerDiv(this._lineLayer);
	}
	this._lineLayer = this._band.createLayerDiv(1);
	this._lineLayer.setAttribute("name", "ether-lines");
	this._lineLayer.style.display = "none";
	var C = this._band.getMinDate();
	var F = this._band.getMaxDate();
	var A = this._band.getTimeZone();
	var E = this._band.getLabeller();
	SimileAjax.DateTime.roundDownToInterval(C, this._unit, A, this._multiple,
			this._theme.firstDayOfWeek);
	var D = this;
	var B = function(G) {
		for ( var H = 0; H < D._multiple; H++) {
			SimileAjax.DateTime.incrementByInterval(G, D._unit);
		}
	};
	while (C.getTime() < F.getTime()) {
		this._intervalMarkerLayout.createIntervalMarker(C, E, this._unit,
				this._markerLayer, this._lineLayer);
		B(C);
	}
	this._markerLayer.style.display = "block";
	this._lineLayer.style.display = "block";
};
Timeline.GregorianEtherPainter.prototype.softPaint = function() {
};
Timeline.GregorianEtherPainter.prototype.zoom = function(A) {
	if (A != 0) {
		this._unit += A;
	}
};
Timeline.HotZoneGregorianEtherPainter = function(G) {
	this._params = G;
	this._theme = G.theme;
	this._zones = [ {
		startTime : Number.NEGATIVE_INFINITY,
		endTime : Number.POSITIVE_INFINITY,
		unit : G.unit,
		multiple : 1
	} ];
	for ( var F = 0; F < G.zones.length; F++) {
		var C = G.zones[F];
		var E = SimileAjax.DateTime.parseGregorianDateTime(C.start).getTime();
		var B = SimileAjax.DateTime.parseGregorianDateTime(C.end).getTime();
		for ( var D = 0; D < this._zones.length && B > E; D++) {
			var A = this._zones[D];
			if (E < A.endTime) {
				if (E > A.startTime) {
					this._zones.splice(D, 0, {
						startTime : A.startTime,
						endTime : E,
						unit : A.unit,
						multiple : A.multiple
					});
					D++;
					A.startTime = E;
				}
				if (B < A.endTime) {
					this._zones.splice(D, 0, {
						startTime : E,
						endTime : B,
						unit : C.unit,
						multiple : (C.multiple) ? C.multiple : 1
					});
					D++;
					A.startTime = B;
					E = B;
				} else {
					A.multiple = C.multiple;
					A.unit = C.unit;
					E = A.endTime;
				}
			}
		}
	}
};
Timeline.HotZoneGregorianEtherPainter.prototype.initialize = function(C, B) {
	this._band = C;
	this._timeline = B;
	this._backgroundLayer = C.createLayerDiv(0);
	this._backgroundLayer.setAttribute("name", "ether-background");
	this._backgroundLayer.className = "timeline-ether-bg";
	this._markerLayer = null;
	this._lineLayer = null;
	var D = ("align" in this._params && this._params.align != undefined) ? this._params.align
			: this._theme.ether.interval.marker[B.isHorizontal() ? "hAlign"
					: "vAlign"];
	var A = ("showLine" in this._params) ? this._params.showLine
			: this._theme.ether.interval.line.show;
	this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(
			this._timeline, this._band, this._theme, D, A);
	this._highlight = new Timeline.EtherHighlight(this._timeline, this._band,
			this._theme, this._backgroundLayer);
};
Timeline.HotZoneGregorianEtherPainter.prototype.setHighlight = function(A, B) {
	this._highlight.position(A, B);
};
Timeline.HotZoneGregorianEtherPainter.prototype.paint = function() {
	if (this._markerLayer) {
		this._band.removeLayerDiv(this._markerLayer);
	}
	this._markerLayer = this._band.createLayerDiv(100);
	this._markerLayer.setAttribute("name", "ether-markers");
	this._markerLayer.style.display = "none";
	if (this._lineLayer) {
		this._band.removeLayerDiv(this._lineLayer);
	}
	this._lineLayer = this._band.createLayerDiv(1);
	this._lineLayer.setAttribute("name", "ether-lines");
	this._lineLayer.style.display = "none";
	var C = this._band.getMinDate();
	var A = this._band.getMaxDate();
	var I = this._band.getTimeZone();
	var L = this._band.getLabeller();
	var B = this;
	var J = function(N, M) {
		for ( var O = 0; O < M.multiple; O++) {
			SimileAjax.DateTime.incrementByInterval(N, M.unit);
		}
	};
	var D = 0;
	while (D < this._zones.length) {
		if (C.getTime() < this._zones[D].endTime) {
			break;
		}
		D++;
	}
	var E = this._zones.length - 1;
	while (E >= 0) {
		if (A.getTime() > this._zones[E].startTime) {
			break;
		}
		E--;
	}
	for ( var H = D; H <= E; H++) {
		var G = this._zones[H];
		var K = new Date(Math.max(C.getTime(), G.startTime));
		var F = new Date(Math.min(A.getTime(), G.endTime));
		SimileAjax.DateTime.roundDownToInterval(K, G.unit, I, G.multiple,
				this._theme.firstDayOfWeek);
		SimileAjax.DateTime.roundUpToInterval(F, G.unit, I, G.multiple,
				this._theme.firstDayOfWeek);
		while (K.getTime() < F.getTime()) {
			this._intervalMarkerLayout.createIntervalMarker(K, L, G.unit,
					this._markerLayer, this._lineLayer);
			J(K, G);
		}
	}
	this._markerLayer.style.display = "block";
	this._lineLayer.style.display = "block";
};
Timeline.HotZoneGregorianEtherPainter.prototype.softPaint = function() {
};
Timeline.HotZoneGregorianEtherPainter.prototype.zoom = function(A) {
	if (A != 0) {
		for ( var B = 0; B < this._zones.length; ++B) {
			if (this._zones[B]) {
				this._zones[B].unit += A;
			}
		}
	}
};
Timeline.YearCountEtherPainter = function(A) {
	this._params = A;
	this._theme = A.theme;
	this._startDate = SimileAjax.DateTime.parseGregorianDateTime(A.startDate);
	this._multiple = ("multiple" in A) ? A.multiple : 1;
};
Timeline.YearCountEtherPainter.prototype.initialize = function(C, B) {
	this._band = C;
	this._timeline = B;
	this._backgroundLayer = C.createLayerDiv(0);
	this._backgroundLayer.setAttribute("name", "ether-background");
	this._backgroundLayer.className = "timeline-ether-bg";
	this._markerLayer = null;
	this._lineLayer = null;
	var D = ("align" in this._params) ? this._params.align
			: this._theme.ether.interval.marker[B.isHorizontal() ? "hAlign"
					: "vAlign"];
	var A = ("showLine" in this._params) ? this._params.showLine
			: this._theme.ether.interval.line.show;
	this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(
			this._timeline, this._band, this._theme, D, A);
	this._highlight = new Timeline.EtherHighlight(this._timeline, this._band,
			this._theme, this._backgroundLayer);
};
Timeline.YearCountEtherPainter.prototype.setHighlight = function(A, B) {
	this._highlight.position(A, B);
};
Timeline.YearCountEtherPainter.prototype.paint = function() {
	if (this._markerLayer) {
		this._band.removeLayerDiv(this._markerLayer);
	}
	this._markerLayer = this._band.createLayerDiv(100);
	this._markerLayer.setAttribute("name", "ether-markers");
	this._markerLayer.style.display = "none";
	if (this._lineLayer) {
		this._band.removeLayerDiv(this._lineLayer);
	}
	this._lineLayer = this._band.createLayerDiv(1);
	this._lineLayer.setAttribute("name", "ether-lines");
	this._lineLayer.style.display = "none";
	var B = new Date(this._startDate.getTime());
	var F = this._band.getMaxDate();
	var E = this._band.getMinDate().getUTCFullYear()
			- this._startDate.getUTCFullYear();
	B.setUTCFullYear(this._band.getMinDate().getUTCFullYear() - E
			% this._multiple);
	var C = this;
	var A = function(G) {
		for ( var H = 0; H < C._multiple; H++) {
			SimileAjax.DateTime
					.incrementByInterval(G, SimileAjax.DateTime.YEAR);
		}
	};
	var D = {
		labelInterval : function(G, I) {
			var H = G.getUTCFullYear() - C._startDate.getUTCFullYear();
			return {
				text : H,
				emphasized : H == 0
			};
		}
	};
	while (B.getTime() < F.getTime()) {
		this._intervalMarkerLayout.createIntervalMarker(B, D,
				SimileAjax.DateTime.YEAR, this._markerLayer, this._lineLayer);
		A(B);
	}
	this._markerLayer.style.display = "block";
	this._lineLayer.style.display = "block";
};
Timeline.YearCountEtherPainter.prototype.softPaint = function() {
};
Timeline.QuarterlyEtherPainter = function(A) {
	this._params = A;
	this._theme = A.theme;
	this._startDate = SimileAjax.DateTime.parseGregorianDateTime(A.startDate);
};
Timeline.QuarterlyEtherPainter.prototype.initialize = function(C, B) {
	this._band = C;
	this._timeline = B;
	this._backgroundLayer = C.createLayerDiv(0);
	this._backgroundLayer.setAttribute("name", "ether-background");
	this._backgroundLayer.className = "timeline-ether-bg";
	this._markerLayer = null;
	this._lineLayer = null;
	var D = ("align" in this._params) ? this._params.align
			: this._theme.ether.interval.marker[B.isHorizontal() ? "hAlign"
					: "vAlign"];
	var A = ("showLine" in this._params) ? this._params.showLine
			: this._theme.ether.interval.line.show;
	this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(
			this._timeline, this._band, this._theme, D, A);
	this._highlight = new Timeline.EtherHighlight(this._timeline, this._band,
			this._theme, this._backgroundLayer);
};
Timeline.QuarterlyEtherPainter.prototype.setHighlight = function(A, B) {
	this._highlight.position(A, B);
};
Timeline.QuarterlyEtherPainter.prototype.paint = function() {
	if (this._markerLayer) {
		this._band.removeLayerDiv(this._markerLayer);
	}
	this._markerLayer = this._band.createLayerDiv(100);
	this._markerLayer.setAttribute("name", "ether-markers");
	this._markerLayer.style.display = "none";
	if (this._lineLayer) {
		this._band.removeLayerDiv(this._lineLayer);
	}
	this._lineLayer = this._band.createLayerDiv(1);
	this._lineLayer.setAttribute("name", "ether-lines");
	this._lineLayer.style.display = "none";
	var B = new Date(0);
	var E = this._band.getMaxDate();
	B.setUTCFullYear(Math.max(this._startDate.getUTCFullYear(), this._band
			.getMinDate().getUTCFullYear()));
	B.setUTCMonth(this._startDate.getUTCMonth());
	var C = this;
	var A = function(F) {
		F.setUTCMonth(F.getUTCMonth() + 3);
	};
	var D = {
		labelInterval : function(G, H) {
			var F = (4 + (G.getUTCMonth() - C._startDate.getUTCMonth()) / 3) % 4;
			if (F != 0) {
				return {
					text : "Q" + (F + 1),
					emphasized : false
				};
			} else {
				return {
					text : "Y"
							+ (G.getUTCFullYear()
									- C._startDate.getUTCFullYear() + 1),
					emphasized : true
				};
			}
		}
	};
	while (B.getTime() < E.getTime()) {
		this._intervalMarkerLayout.createIntervalMarker(B, D,
				SimileAjax.DateTime.YEAR, this._markerLayer, this._lineLayer);
		A(B);
	}
	this._markerLayer.style.display = "block";
	this._lineLayer.style.display = "block";
};
Timeline.QuarterlyEtherPainter.prototype.softPaint = function() {
};
Timeline.EtherIntervalMarkerLayout = function(I, L, C, E, M) {
	var A = I.isHorizontal();
	if (A) {
		if (E == "Top") {
			this.positionDiv = function(O, N) {
				O.style.left = N + "px";
				O.style.top = "0px";
			};
		} else {
			this.positionDiv = function(O, N) {
				O.style.left = N + "px";
				O.style.bottom = "0px";
			};
		}
	} else {
		if (E == "Left") {
			this.positionDiv = function(O, N) {
				O.style.top = N + "px";
				O.style.left = "0px";
			};
		} else {
			this.positionDiv = function(O, N) {
				O.style.top = N + "px";
				O.style.right = "0px";
			};
		}
	}
	var D = C.ether.interval.marker;
	var K = C.ether.interval.line;
	var B = C.ether.interval.weekend;
	var H = (A ? "h" : "v") + E;
	var G = D[H + "Styler"];
	var J = D[H + "EmphasizedStyler"];
	var F = SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.DAY];
	this.createIntervalMarker = function(T, c, a, Y, P) {
		var U = Math.round(L.dateToPixelOffset(T));
		if (M && a != SimileAjax.DateTime.WEEK) {
			var V = I.getDocument().createElement("div");
			V.className = "timeline-ether-lines";
			if (K.opacity < 100) {
				SimileAjax.Graphics.setOpacity(V, K.opacity);
			}
			if (A) {
				V.style.left = U + "px";
			} else {
				V.style.top = U + "px";
			}
			P.appendChild(V);
		}
		if (a == SimileAjax.DateTime.WEEK) {
			var N = C.firstDayOfWeek;
			var R = new Date(T.getTime() + (6 - N - 7) * F);
			var b = new Date(R.getTime() + 2 * F);
			var Q = Math.round(L.dateToPixelOffset(R));
			var S = Math.round(L.dateToPixelOffset(b));
			var W = Math.max(1, S - Q);
			var X = I.getDocument().createElement("div");
			X.className = "timeline-ether-weekends";
			if (B.opacity < 100) {
				SimileAjax.Graphics.setOpacity(X, B.opacity);
			}
			if (A) {
				X.style.left = Q + "px";
				X.style.width = W + "px";
			} else {
				X.style.top = Q + "px";
				X.style.height = W + "px";
			}
			P.appendChild(X);
		}
		var Z = c.labelInterval(T, a);
		var O = I.getDocument().createElement("div");
		O.innerHTML = Z.text;
		O.className = "timeline-date-label";
		if (Z.emphasized) {
			O.className += " timeline-date-label-em";
		}
		this.positionDiv(O, U);
		Y.appendChild(O);
		return O;
	};
};
Timeline.EtherHighlight = function(B, E, D, C) {
	var A = B.isHorizontal();
	this._highlightDiv = null;
	this._createHighlightDiv = function() {
		if (this._highlightDiv == null) {
			this._highlightDiv = B.getDocument().createElement("div");
			this._highlightDiv.setAttribute("name", "ether-highlight");
			this._highlightDiv.className = "timeline-ether-highlight";
			var F = D.ether.highlightOpacity;
			if (F < 100) {
				SimileAjax.Graphics.setOpacity(this._highlightDiv, F);
			}
			C.appendChild(this._highlightDiv);
		}
	};
	this.position = function(H, J) {
		this._createHighlightDiv();
		var I = Math.round(E.dateToPixelOffset(H));
		var G = Math.round(E.dateToPixelOffset(J));
		var F = Math.max(G - I, 3);
		if (A) {
			this._highlightDiv.style.left = I + "px";
			this._highlightDiv.style.width = F + "px";
			this._highlightDiv.style.height = (E.getViewWidth() - 4) + "px";
		} else {
			this._highlightDiv.style.top = I + "px";
			this._highlightDiv.style.height = F + "px";
			this._highlightDiv.style.width = (E.getViewWidth() - 4) + "px";
		}
	};
};

/* ethers.js */
Timeline.LinearEther = function(A) {
	this._params = A;
	this._interval = A.interval;
	this._pixelsPerInterval = A.pixelsPerInterval;
};
Timeline.LinearEther.prototype.initialize = function(B, A) {
	this._band = B;
	this._timeline = A;
	this._unit = A.getUnit();
	if ("startsOn" in this._params) {
		this._start = this._unit.parseFromObject(this._params.startsOn);
	} else {
		if ("endsOn" in this._params) {
			this._start = this._unit.parseFromObject(this._params.endsOn);
			this.shiftPixels(-this._timeline.getPixelLength());
		} else {
			if ("centersOn" in this._params) {
				this._start = this._unit
						.parseFromObject(this._params.centersOn);
				this.shiftPixels(-this._timeline.getPixelLength() / 2);
			} else {
				this._start = this._unit.makeDefaultValue();
				this.shiftPixels(-this._timeline.getPixelLength() / 2);
			}
		}
	}
};
Timeline.LinearEther.prototype.setDate = function(A) {
	this._start = this._unit.cloneValue(A);
};
Timeline.LinearEther.prototype.shiftPixels = function(B) {
	var A = this._interval * B / this._pixelsPerInterval;
	this._start = this._unit.change(this._start, A);
};
Timeline.LinearEther.prototype.dateToPixelOffset = function(B) {
	var A = this._unit.compare(B, this._start);
	return this._pixelsPerInterval * A / this._interval;
};
Timeline.LinearEther.prototype.pixelOffsetToDate = function(B) {
	var A = B * this._interval / this._pixelsPerInterval;
	return this._unit.change(this._start, A);
};
Timeline.LinearEther.prototype.zoom = function(D) {
	var A = 0;
	var B = this._band._zoomIndex;
	var C = B;
	if (D && (B > 0)) {
		C = B - 1;
	}
	if (!D && (B < (this._band._zoomSteps.length - 1))) {
		C = B + 1;
	}
	this._band._zoomIndex = C;
	this._interval = SimileAjax.DateTime.gregorianUnitLengths[this._band._zoomSteps[C].unit];
	this._pixelsPerInterval = this._band._zoomSteps[C].pixelsPerInterval;
	A = this._band._zoomSteps[C].unit - this._band._zoomSteps[B].unit;
	return A;
};
Timeline.HotZoneEther = function(A) {
	this._params = A;
	this._interval = A.interval;
	this._pixelsPerInterval = A.pixelsPerInterval;
	this._theme = A.theme;
};
Timeline.HotZoneEther.prototype.initialize = function(I, H) {
	this._band = I;
	this._timeline = H;
	this._unit = H.getUnit();
	this._zones = [ {
		startTime : Number.NEGATIVE_INFINITY,
		endTime : Number.POSITIVE_INFINITY,
		magnify : 1
	} ];
	var D = this._params;
	for ( var E = 0; E < D.zones.length; E++) {
		var G = D.zones[E];
		var F = this._unit.parseFromObject(G.start);
		var B = this._unit.parseFromObject(G.end);
		for ( var C = 0; C < this._zones.length && this._unit.compare(B, F) > 0; C++) {
			var A = this._zones[C];
			if (this._unit.compare(F, A.endTime) < 0) {
				if (this._unit.compare(F, A.startTime) > 0) {
					this._zones.splice(C, 0, {
						startTime : A.startTime,
						endTime : F,
						magnify : A.magnify
					});
					C++;
					A.startTime = F;
				}
				if (this._unit.compare(B, A.endTime) < 0) {
					this._zones.splice(C, 0, {
						startTime : F,
						endTime : B,
						magnify : G.magnify * A.magnify
					});
					C++;
					A.startTime = B;
					F = B;
				} else {
					A.magnify *= G.magnify;
					F = A.endTime;
				}
			}
		}
	}
	if ("startsOn" in this._params) {
		this._start = this._unit.parseFromObject(this._params.startsOn);
	} else {
		if ("endsOn" in this._params) {
			this._start = this._unit.parseFromObject(this._params.endsOn);
			this.shiftPixels(-this._timeline.getPixelLength());
		} else {
			if ("centersOn" in this._params) {
				this._start = this._unit
						.parseFromObject(this._params.centersOn);
				this.shiftPixels(-this._timeline.getPixelLength() / 2);
			} else {
				this._start = this._unit.makeDefaultValue();
				this.shiftPixels(-this._timeline.getPixelLength() / 2);
			}
		}
	}
};
Timeline.HotZoneEther.prototype.setDate = function(A) {
	this._start = this._unit.cloneValue(A);
};
Timeline.HotZoneEther.prototype.shiftPixels = function(A) {
	this._start = this.pixelOffsetToDate(A);
};
Timeline.HotZoneEther.prototype.dateToPixelOffset = function(A) {
	return this._dateDiffToPixelOffset(this._start, A);
};
Timeline.HotZoneEther.prototype.pixelOffsetToDate = function(A) {
	return this._pixelOffsetToDate(A, this._start);
};
Timeline.HotZoneEther.prototype.zoom = function(D) {
	var A = 0;
	var B = this._band._zoomIndex;
	var C = B;
	if (D && (B > 0)) {
		C = B - 1;
	}
	if (!D && (B < (this._band._zoomSteps.length - 1))) {
		C = B + 1;
	}
	this._band._zoomIndex = C;
	this._interval = SimileAjax.DateTime.gregorianUnitLengths[this._band._zoomSteps[C].unit];
	this._pixelsPerInterval = this._band._zoomSteps[C].pixelsPerInterval;
	A = this._band._zoomSteps[C].unit - this._band._zoomSteps[B].unit;
	return A;
};
Timeline.HotZoneEther.prototype._dateDiffToPixelOffset = function(H, C) {
	var D = this._getScale();
	var I = H;
	var B = C;
	var E = 0;
	if (this._unit.compare(I, B) < 0) {
		var G = 0;
		while (G < this._zones.length) {
			if (this._unit.compare(I, this._zones[G].endTime) < 0) {
				break;
			}
			G++;
		}
		while (this._unit.compare(I, B) < 0) {
			var F = this._zones[G];
			var A = this._unit.earlier(B, F.endTime);
			E += (this._unit.compare(A, I) / (D / F.magnify));
			I = A;
			G++;
		}
	} else {
		var G = this._zones.length - 1;
		while (G >= 0) {
			if (this._unit.compare(I, this._zones[G].startTime) > 0) {
				break;
			}
			G--;
		}
		while (this._unit.compare(I, B) > 0) {
			var F = this._zones[G];
			var A = this._unit.later(B, F.startTime);
			E += (this._unit.compare(A, I) / (D / F.magnify));
			I = A;
			G--;
		}
	}
	return E;
};
Timeline.HotZoneEther.prototype._pixelOffsetToDate = function(E, B) {
	var G = this._getScale();
	var D = B;
	if (E > 0) {
		var F = 0;
		while (F < this._zones.length) {
			if (this._unit.compare(D, this._zones[F].endTime) < 0) {
				break;
			}
			F++;
		}
		while (E > 0) {
			var A = this._zones[F];
			var H = G / A.magnify;
			if (A.endTime == Number.POSITIVE_INFINITY) {
				D = this._unit.change(D, E * H);
				E = 0;
			} else {
				var C = this._unit.compare(A.endTime, D) / H;
				if (C > E) {
					D = this._unit.change(D, E * H);
					E = 0;
				} else {
					D = A.endTime;
					E -= C;
				}
			}
			F++;
		}
	} else {
		var F = this._zones.length - 1;
		while (F >= 0) {
			if (this._unit.compare(D, this._zones[F].startTime) > 0) {
				break;
			}
			F--;
		}
		E = -E;
		while (E > 0) {
			var A = this._zones[F];
			var H = G / A.magnify;
			if (A.startTime == Number.NEGATIVE_INFINITY) {
				D = this._unit.change(D, -E * H);
				E = 0;
			} else {
				var C = this._unit.compare(D, A.startTime) / H;
				if (C > E) {
					D = this._unit.change(D, -E * H);
					E = 0;
				} else {
					D = A.startTime;
					E -= C;
				}
			}
			F--;
		}
	}
	return D;
};
Timeline.HotZoneEther.prototype._getScale = function() {
	return this._interval / this._pixelsPerInterval;
};

/* event-utils.js */
Timeline.EventUtils = {};
Timeline.EventUtils.getNewEventID = function() {
	if (this._lastEventID == null) {
		this._lastEventID = 0;
	}
	this._lastEventID += 1;
	return "e" + this._lastEventID;
};
Timeline.EventUtils.decodeEventElID = function(C) {
	var D = C.split("-");
	if (D[1] != "tl") {
		alert("Internal Timeline problem 101, please consult support");
		return {
			band : null,
			evt : null
		};
	}
	var B = Timeline.getTimelineFromID(D[2]);
	var E = B.getBand(D[3]);
	var A = E.getEventSource.getEvent(D[4]);
	return {
		band : E,
		evt : A
	};
};
Timeline.EventUtils.encodeEventElID = function(B, D, C, A) {
	return C + "-tl-" + B.timelineID + "-" + D.getIndex() + "-" + A.getID();
};

/* labellers.js */
Timeline.GregorianDateLabeller = function(B, A) {
	this._locale = B;
	this._timeZone = A;
};
Timeline.GregorianDateLabeller.monthNames = [];
Timeline.GregorianDateLabeller.dayNames = [];
Timeline.GregorianDateLabeller.labelIntervalFunctions = [];
Timeline.GregorianDateLabeller.getMonthName = function(B, A) {
	return Timeline.GregorianDateLabeller.monthNames[A][B];
};
Timeline.GregorianDateLabeller.prototype.labelInterval = function(A, C) {
	var B = Timeline.GregorianDateLabeller.labelIntervalFunctions[this._locale];
	if (B == null) {
		B = Timeline.GregorianDateLabeller.prototype.defaultLabelInterval;
	}
	return B.call(this, A, C);
};
Timeline.GregorianDateLabeller.prototype.labelPrecise = function(A) {
	return SimileAjax.DateTime.removeTimeZoneOffset(A, this._timeZone)
			.toUTCString();
};
Timeline.GregorianDateLabeller.prototype.defaultLabelInterval = function(B, C) {
	var D;
	var F = false;
	B = SimileAjax.DateTime.removeTimeZoneOffset(B, this._timeZone);
	switch (C) {
	case SimileAjax.DateTime.MILLISECOND:
		D = B.getUTCMilliseconds();
		break;
	case SimileAjax.DateTime.SECOND:
		D = B.getUTCSeconds();
		break;
	case SimileAjax.DateTime.MINUTE:
		var A = B.getUTCMinutes();
		if (A == 0) {
			D = B.getUTCHours() + ":00";
			F = true;
		} else {
			D = A;
		}
		break;
	case SimileAjax.DateTime.HOUR:
		D = B.getUTCHours() + "hr";
		break;
	case SimileAjax.DateTime.DAY:
		D = Timeline.GregorianDateLabeller.getMonthName(B.getUTCMonth(),
				this._locale)
				+ " " + B.getUTCDate();
		break;
	case SimileAjax.DateTime.WEEK:
		D = Timeline.GregorianDateLabeller.getMonthName(B.getUTCMonth(),
				this._locale)
				+ " " + B.getUTCDate();
		break;
	case SimileAjax.DateTime.MONTH:
		var A = B.getUTCMonth();
		if (A != 0) {
			D = Timeline.GregorianDateLabeller.getMonthName(A, this._locale);
			break;
		}
	case SimileAjax.DateTime.YEAR:
	case SimileAjax.DateTime.DECADE:
	case SimileAjax.DateTime.CENTURY:
	case SimileAjax.DateTime.MILLENNIUM:
		var E = B.getUTCFullYear();
		if (E > 0) {
			D = B.getUTCFullYear();
		} else {
			D = (1 - E) + "BC";
		}
		F = (C == SimileAjax.DateTime.MONTH)
				|| (C == SimileAjax.DateTime.DECADE && E % 100 == 0)
				|| (C == SimileAjax.DateTime.CENTURY && E % 1000 == 0);
		break;
	default:
		D = B.toUTCString();
	}
	return {
		text : D,
		emphasized : F
	};
};

/* original-painter.js */
Timeline.OriginalEventPainter = function(A) {
	this._params = A;
	this._onSelectListeners = [];
	this._eventPaintListeners = [];
	this._filterMatcher = null;
	this._highlightMatcher = null;
	this._frc = null;
	this._eventIdToElmt = {};
};
Timeline.OriginalEventPainter.prototype.initialize = function(B, A) {
	this._band = B;
	this._timeline = A;
	this._backLayer = null;
	this._eventLayer = null;
	this._lineLayer = null;
	this._highlightLayer = null;
	this._eventIdToElmt = null;
};
Timeline.OriginalEventPainter.prototype.getType = function() {
	return "original";
};
Timeline.OriginalEventPainter.prototype.addOnSelectListener = function(A) {
	this._onSelectListeners.push(A);
};
Timeline.OriginalEventPainter.prototype.removeOnSelectListener = function(B) {
	for ( var A = 0; A < this._onSelectListeners.length; A++) {
		if (this._onSelectListeners[A] == B) {
			this._onSelectListeners.splice(A, 1);
			break;
		}
	}
};
Timeline.OriginalEventPainter.prototype.addEventPaintListener = function(A) {
	this._eventPaintListeners.push(A);
};
Timeline.OriginalEventPainter.prototype.removeEventPaintListener = function(B) {
	for ( var A = 0; A < this._eventPaintListeners.length; A++) {
		if (this._eventPaintListeners[A] == B) {
			this._eventPaintListeners.splice(A, 1);
			break;
		}
	}
};
Timeline.OriginalEventPainter.prototype.getFilterMatcher = function() {
	return this._filterMatcher;
};
Timeline.OriginalEventPainter.prototype.setFilterMatcher = function(A) {
	this._filterMatcher = A;
};
Timeline.OriginalEventPainter.prototype.getHighlightMatcher = function() {
	return this._highlightMatcher;
};
Timeline.OriginalEventPainter.prototype.setHighlightMatcher = function(A) {
	this._highlightMatcher = A;
};
Timeline.OriginalEventPainter.prototype.paint = function() {
	var C = this._band.getEventSource();
	if (C == null) {
		return;
	}
	this._eventIdToElmt = {};
	this._fireEventPaintListeners("paintStarting", null, null);
	this._prepareForPainting();
	var I = this._params.theme.event;
	var G = Math.max(I.track.height, I.tape.height + this._frc.getLineHeight());
	var F = {
		trackOffset : I.track.offset,
		trackHeight : G,
		trackGap : I.track.gap,
		trackIncrement : G + I.track.gap,
		icon : I.instant.icon,
		iconWidth : I.instant.iconWidth,
		iconHeight : I.instant.iconHeight,
		labelWidth : I.label.width,
		maxLabelChar : I.label.maxLabelChar,
		impreciseIconMargin : I.instant.impreciseIconMargin
	};
	var D = this._band.getMinDate();
	var B = this._band.getMaxDate();
	var J = (this._filterMatcher != null) ? this._filterMatcher : function(K) {
		return true;
	};
	var A = (this._highlightMatcher != null) ? this._highlightMatcher
			: function(K) {
				return -1;
			};
	var E = C.getEventReverseIterator(D, B);
	while (E.hasNext()) {
		var H = E.next();
		if (J(H)) {
			this.paintEvent(H, F, this._params.theme, A(H));
		}
	}
	this._highlightLayer.style.display = "block";
	this._lineLayer.style.display = "block";
	this._eventLayer.style.display = "block";
	this._band.updateEventTrackInfo(this._tracks.length, F.trackIncrement);
	this._fireEventPaintListeners("paintEnded", null, null);
};
Timeline.OriginalEventPainter.prototype.softPaint = function() {
};
Timeline.OriginalEventPainter.prototype._prepareForPainting = function() {
	var B = this._band;
	if (this._backLayer == null) {
		this._backLayer = this._band.createLayerDiv(0, "timeline-band-events");
		this._backLayer.style.visibility = "hidden";
		var A = document.createElement("span");
		A.className = "timeline-event-label";
		this._backLayer.appendChild(A);
		this._frc = SimileAjax.Graphics.getFontRenderingContext(A);
	}
	this._frc.update();
	this._tracks = [];
	if (this._highlightLayer != null) {
		B.removeLayerDiv(this._highlightLayer);
	}
	this._highlightLayer = B.createLayerDiv(105, "timeline-band-highlights");
	this._highlightLayer.style.display = "none";
	if (this._lineLayer != null) {
		B.removeLayerDiv(this._lineLayer);
	}
	this._lineLayer = B.createLayerDiv(110, "timeline-band-lines");
	this._lineLayer.style.display = "none";
	if (this._eventLayer != null) {
		B.removeLayerDiv(this._eventLayer);
	}
	this._eventLayer = B.createLayerDiv(115, "timeline-band-events");
	this._eventLayer.style.display = "none";
};
Timeline.OriginalEventPainter.prototype.paintEvent = function(B, C, D, A) {
	if (B.isInstant()) {
		this.paintInstantEvent(B, C, D, A);
	} else {
		this.paintDurationEvent(B, C, D, A);
	}
};
Timeline.OriginalEventPainter.prototype.paintInstantEvent = function(B, C, D, A) {
	if (B.isImprecise()) {
		this.paintImpreciseInstantEvent(B, C, D, A);
	} else {
		this.paintPreciseInstantEvent(B, C, D, A);
	}
};
Timeline.OriginalEventPainter.prototype.paintDurationEvent = function(B, C, D,
		A) {
	if (B.isImprecise()) {
		this.paintImpreciseDurationEvent(B, C, D, A);
	} else {
		this.paintPreciseDurationEvent(B, C, D, A);
	}
};
Timeline.OriginalEventPainter.prototype.paintPreciseInstantEvent = function(N,
		S, V, T) {
	var W = this._timeline.getDocument();
	var L = N.getText();
	var H = N.getStart();
	var I = Math.round(this._band.dateToPixelOffset(H));
	var A = Math.round(I + S.iconWidth / 2);
	var C = Math.round(I - S.iconWidth / 2);
	var F = this._getLabelDivClassName(N);
	var D = this._frc.computeSize(L, F);
	var M = A + V.event.label.offsetFromLine;
	var J = M + D.width;
	var Q = J;
	var P = this._findFreeTrack(N, Q);
	var R = Math.round(S.trackOffset + P * S.trackIncrement + S.trackHeight / 2
			- D.height / 2);
	var B = this._paintEventIcon(N, P, C, S, V, 0);
	var U = this._paintEventLabel(N, L, M, R, D.width, D.height, V, F, T);
	var E = [ B.elmt, U.elmt ];
	var O = this;
	var K = function(Y, X, Z) {
		return O._onClickInstantEvent(B.elmt, X, N);
	};
	SimileAjax.DOM.registerEvent(B.elmt, "mousedown", K);
	SimileAjax.DOM.registerEvent(U.elmt, "mousedown", K);
	var G = this._createHighlightDiv(T, B, V, N);
	if (G != null) {
		E.push(G);
	}
	this._fireEventPaintListeners("paintedEvent", N, E);
	this._eventIdToElmt[N.getID()] = B.elmt;
	this._tracks[P] = C;
};
Timeline.OriginalEventPainter.prototype.paintImpreciseInstantEvent = function(
		P, U, Z, W) {
	var b = this._timeline.getDocument();
	var N = P.getText();
	var J = P.getStart();
	var X = P.getEnd();
	var K = Math.round(this._band.dateToPixelOffset(J));
	var B = Math.round(this._band.dateToPixelOffset(X));
	var A = Math.round(K + U.iconWidth / 2);
	var D = Math.round(K - U.iconWidth / 2);
	var H = this._getLabelDivClassName(P);
	var F = this._frc.computeSize(N, H);
	var O = A + Z.event.label.offsetFromLine;
	var L = O + F.width;
	var S = Math.max(L, B);
	var R = this._findFreeTrack(P, S);
	var a = Z.event.tape.height;
	var T = Math.round(U.trackOffset + R * U.trackIncrement + a);
	var C = this._paintEventIcon(P, R, D, U, Z, a);
	var Y = this._paintEventLabel(P, N, O, T, F.width, F.height, Z, H, W);
	var V = P.getColor();
	V = V != null ? V : Z.event.instant.impreciseColor;
	var E = this._paintEventTape(P, R, K, B, V,
			Z.event.instant.impreciseOpacity, U, Z, 0);
	var G = [ C.elmt, Y.elmt, E.elmt ];
	var Q = this;
	var M = function(d, c, e) {
		return Q._onClickInstantEvent(C.elmt, c, P);
	};
	SimileAjax.DOM.registerEvent(C.elmt, "mousedown", M);
	SimileAjax.DOM.registerEvent(E.elmt, "mousedown", M);
	SimileAjax.DOM.registerEvent(Y.elmt, "mousedown", M);
	var I = this._createHighlightDiv(W, C, Z, P);
	if (I != null) {
		G.push(I);
	}
	this._fireEventPaintListeners("paintedEvent", P, G);
	this._eventIdToElmt[P.getID()] = C.elmt;
	this._tracks[R] = D;
};
Timeline.OriginalEventPainter.prototype.paintPreciseDurationEvent = function(M,
		R, W, T) {
	var X = this._timeline.getDocument();
	var K = M.getText();
	var G = M.getStart();
	var U = M.getEnd();
	var H = Math.round(this._band.dateToPixelOffset(G));
	var A = Math.round(this._band.dateToPixelOffset(U));
	var E = this._getLabelDivClassName(M);
	var C = this._frc.computeSize(K, E);
	var L = H;
	var I = L + C.width;
	var P = Math.max(I, A);
	var O = this._findFreeTrack(M, P);
	var Q = Math.round(R.trackOffset + O * R.trackIncrement
			+ W.event.tape.height);
	var S = M.getColor();
	S = S != null ? S : W.event.duration.color;
	var B = this._paintEventTape(M, O, H, A, S, 100, R, W, 0);
	var V = this._paintEventLabel(M, K, L, Q, C.width, C.height, W, E, T);
	var D = [ B.elmt, V.elmt ];
	var N = this;
	var J = function(Z, Y, a) {
		return N._onClickDurationEvent(B.elmt, Y, M);
	};
	SimileAjax.DOM.registerEvent(B.elmt, "mousedown", J);
	SimileAjax.DOM.registerEvent(V.elmt, "mousedown", J);
	var F = this._createHighlightDiv(T, B, W, M);
	if (F != null) {
		D.push(F);
	}
	this._fireEventPaintListeners("paintedEvent", M, D);
	this._eventIdToElmt[M.getID()] = B.elmt;
	this._tracks[O] = H;
};
Timeline.OriginalEventPainter.prototype.paintImpreciseDurationEvent = function(
		O, W, b, Y) {
	var c = this._timeline.getDocument();
	var M = O.getText();
	var I = O.getStart();
	var V = O.getLatestStart();
	var Z = O.getEnd();
	var Q = O.getEarliestEnd();
	var K = Math.round(this._band.dateToPixelOffset(I));
	var F = Math.round(this._band.dateToPixelOffset(V));
	var A = Math.round(this._band.dateToPixelOffset(Z));
	var G = Math.round(this._band.dateToPixelOffset(Q));
	var E = this._getLabelDivClassName(O);
	var C = this._frc.computeSize(M, E);
	var N = F;
	var J = N + C.width;
	var S = Math.max(J, A);
	var R = this._findFreeTrack(O, S);
	var T = Math.round(W.trackOffset + R * W.trackIncrement
			+ b.event.tape.height);
	var X = O.getColor();
	X = X != null ? X : b.event.duration.color;
	var U = this._paintEventTape(O, R, K, A, b.event.duration.impreciseColor,
			b.event.duration.impreciseOpacity, W, b, 0);
	var B = this._paintEventTape(O, R, F, G, X, 100, W, b, 1);
	var a = this._paintEventLabel(O, M, N, T, C.width, C.height, b, E, Y);
	var D = [ U.elmt, B.elmt, a.elmt ];
	var P = this;
	var L = function(e, d, f) {
		return P._onClickDurationEvent(B.elmt, d, O);
	};
	SimileAjax.DOM.registerEvent(B.elmt, "mousedown", L);
	SimileAjax.DOM.registerEvent(a.elmt, "mousedown", L);
	var H = this._createHighlightDiv(Y, B, b, O);
	if (H != null) {
		D.push(H);
	}
	this._fireEventPaintListeners("paintedEvent", O, D);
	this._eventIdToElmt[O.getID()] = B.elmt;
	this._tracks[R] = K;
};
Timeline.OriginalEventPainter.prototype._encodeEventElID = function(B, A) {
	return Timeline.EventUtils
			.encodeEventElID(this._timeline, this._band, B, A);
};
Timeline.OriginalEventPainter.prototype._findFreeTrack = function(E, D) {
	var A = E.getTrackNum();
	if (A != null) {
		return A;
	}
	for ( var C = 0; C < this._tracks.length; C++) {
		var B = this._tracks[C];
		if (B > D) {
			break;
		}
	}
	return C;
};
Timeline.OriginalEventPainter.prototype._paintEventIcon = function(K, B, C, G,
		F, D) {
	var I = K.getIcon();
	I = I != null ? I : G.icon;
	var J;
	if (D > 0) {
		J = G.trackOffset + B * G.trackIncrement + D + G.impreciseIconMargin;
	} else {
		var H = G.trackOffset + B * G.trackIncrement + G.trackHeight / 2;
		J = Math.round(H - G.iconHeight / 2);
	}
	var E = SimileAjax.Graphics.createTranslucentImage(I);
	var A = this._timeline.getDocument().createElement("div");
	A.className = this._getElClassName("timeline-event-icon", K, "icon");
	A.id = this._encodeEventElID("icon", K);
	A.style.left = C + "px";
	A.style.top = J + "px";
	A.appendChild(E);
	if (K._title != null) {
		A.title = K._title;
	}
	this._eventLayer.appendChild(A);
	return {
		left : C,
		top : J,
		width : G.iconWidth,
		height : G.iconHeight,
		elmt : A
	};
};
Timeline.OriginalEventPainter.prototype._paintEventLabel = function(K, L, D, H,
		A, J, G, E, C) {
	var I = this._timeline.getDocument();
	var B = I.createElement("div");
	B.className = E;
	B.id = this._encodeEventElID("label", K);
	B.style.left = D + "px";
	B.style.width = A + "px";
	B.style.top = H + "px";
	B.innerHTML = L;
	if (K._title != null) {
		B.title = K._title;
	}
	var F = K.getTextColor();
	if (F == null) {
		F = K.getColor();
	}
	if (F != null) {
		B.style.color = F;
	}
	if (G.event.highlightLabelBackground && C >= 0) {
		B.style.background = this._getHighlightColor(C, G);
	}
	this._eventLayer.appendChild(B);
	return {
		left : D,
		top : H,
		width : A,
		height : J,
		elmt : B
	};
};
Timeline.OriginalEventPainter.prototype._paintEventTape = function(N, B, D, A,
		G, C, J, I, M) {
	var F = A - D;
	var E = I.event.tape.height;
	var K = J.trackOffset + B * J.trackIncrement;
	var O = this._timeline.getDocument().createElement("div");
	O.className = this._getElClassName("timeline-event-tape", N, "tape");
	O.id = this._encodeEventElID("tape" + M, N);
	O.style.left = D + "px";
	O.style.width = F + "px";
	O.style.height = E + "px";
	O.style.top = K + "px";
	if (N._title != null) {
		O.title = N._title;
	}
	if (G != null) {
		O.style.backgroundColor = G;
	}
	var L = N.getTapeImage();
	var H = N.getTapeRepeat();
	H = H != null ? H : "repeat";
	if (L != null) {
		O.style.backgroundImage = "url(" + L + ")";
		O.style.backgroundRepeat = H;
	}
	SimileAjax.Graphics.setOpacity(O, C);
	this._eventLayer.appendChild(O);
	return {
		left : D,
		top : K,
		width : F,
		height : E,
		elmt : O
	};
};
Timeline.OriginalEventPainter.prototype._getLabelDivClassName = function(A) {
	return this._getElClassName("timeline-event-label", A, "label");
};
Timeline.OriginalEventPainter.prototype._getElClassName = function(D, C, A) {
	var E = C.getClassName(), B = [];
	if (E) {
		if (A) {
			B.push(A + "-" + E + " ");
		}
		B.push(E + " ");
	}
	B.push(D);
	return (B.join(""));
};
Timeline.OriginalEventPainter.prototype._getHighlightColor = function(A, B) {
	var C = B.event.highlightColors;
	return C[Math.min(A, C.length - 1)];
};
Timeline.OriginalEventPainter.prototype._createHighlightDiv = function(A, D, F,
		B) {
	var G = null;
	if (A >= 0) {
		var E = this._timeline.getDocument();
		var C = this._getHighlightColor(A, F);
		G = E.createElement("div");
		G.className = this._getElClassName("timeline-event-highlight", B,
				"highlight");
		G.id = this._encodeEventElID("highlight0", B);
		G.style.position = "absolute";
		G.style.overflow = "hidden";
		G.style.left = (D.left - 2) + "px";
		G.style.width = (D.width + 4) + "px";
		G.style.top = (D.top - 2) + "px";
		G.style.height = (D.height + 4) + "px";
		G.style.background = C;
		this._highlightLayer.appendChild(G);
	}
	return G;
};
Timeline.OriginalEventPainter.prototype._onClickInstantEvent = function(C, A, B) {
	var D = SimileAjax.DOM.getPageCoordinates(C);
	this._showBubble(D.left + Math.ceil(C.offsetWidth / 2), D.top
			+ Math.ceil(C.offsetHeight / 2), B);
	this._fireOnSelect(B.getID());
	A.cancelBubble = true;
	SimileAjax.DOM.cancelEvent(A);
	return false;
};
Timeline.OriginalEventPainter.prototype._onClickDurationEvent = function(F, B,
		C) {
	if ("pageX" in B) {
		var A = B.pageX;
		var E = B.pageY;
	} else {
		var D = SimileAjax.DOM.getPageCoordinates(F);
		var A = B.offsetX + D.left;
		var E = B.offsetY + D.top;
	}
	this._showBubble(A, E, C);
	this._fireOnSelect(C.getID());
	B.cancelBubble = true;
	SimileAjax.DOM.cancelEvent(B);
	return false;
};
Timeline.OriginalEventPainter.prototype.showBubble = function(A) {
	var B = this._eventIdToElmt[A.getID()];
	if (B) {
		var C = SimileAjax.DOM.getPageCoordinates(B);
		this._showBubble(C.left + B.offsetWidth / 2,
				C.top + B.offsetHeight / 2, A);
	}
};
Timeline.OriginalEventPainter.prototype._showBubble = function(B, E, C) {
	var D = document.createElement("div");
	var A = this._params.theme.event.bubble;
	C.fillInfoBubble(D, this._params.theme, this._band.getLabeller());
	SimileAjax.WindowManager.cancelPopups();
	SimileAjax.Graphics.createBubbleForContentAndPoint(D, B, E, A.width, null,
			A.maxHeight);
};
Timeline.OriginalEventPainter.prototype._fireOnSelect = function(A) {
	for ( var B = 0; B < this._onSelectListeners.length; B++) {
		this._onSelectListeners[B](A);
	}
};
Timeline.OriginalEventPainter.prototype._fireEventPaintListeners = function(D,
		A, C) {
	for ( var B = 0; B < this._eventPaintListeners.length; B++) {
		this._eventPaintListeners[B](this._band, D, A, C);
	}
};

/* overview-painter.js */
Timeline.OverviewEventPainter = function(A) {
	this._params = A;
	this._onSelectListeners = [];
	this._filterMatcher = null;
	this._highlightMatcher = null;
};
Timeline.OverviewEventPainter.prototype.initialize = function(B, A) {
	this._band = B;
	this._timeline = A;
	this._eventLayer = null;
	this._highlightLayer = null;
};
Timeline.OverviewEventPainter.prototype.getType = function() {
	return "overview";
};
Timeline.OverviewEventPainter.prototype.addOnSelectListener = function(A) {
	this._onSelectListeners.push(A);
};
Timeline.OverviewEventPainter.prototype.removeOnSelectListener = function(B) {
	for ( var A = 0; A < this._onSelectListeners.length; A++) {
		if (this._onSelectListeners[A] == B) {
			this._onSelectListeners.splice(A, 1);
			break;
		}
	}
};
Timeline.OverviewEventPainter.prototype.getFilterMatcher = function() {
	return this._filterMatcher;
};
Timeline.OverviewEventPainter.prototype.setFilterMatcher = function(A) {
	this._filterMatcher = A;
};
Timeline.OverviewEventPainter.prototype.getHighlightMatcher = function() {
	return this._highlightMatcher;
};
Timeline.OverviewEventPainter.prototype.setHighlightMatcher = function(A) {
	this._highlightMatcher = A;
};
Timeline.OverviewEventPainter.prototype.paint = function() {
	var C = this._band.getEventSource();
	if (C == null) {
		return;
	}
	this._prepareForPainting();
	var H = this._params.theme.event;
	var F = {
		trackOffset : H.overviewTrack.offset,
		trackHeight : H.overviewTrack.height,
		trackGap : H.overviewTrack.gap,
		trackIncrement : H.overviewTrack.height + H.overviewTrack.gap
	};
	var D = this._band.getMinDate();
	var B = this._band.getMaxDate();
	var I = (this._filterMatcher != null) ? this._filterMatcher : function(J) {
		return true;
	};
	var A = (this._highlightMatcher != null) ? this._highlightMatcher
			: function(J) {
				return -1;
			};
	var E = C.getEventReverseIterator(D, B);
	while (E.hasNext()) {
		var G = E.next();
		if (I(G)) {
			this.paintEvent(G, F, this._params.theme, A(G));
		}
	}
	this._highlightLayer.style.display = "block";
	this._eventLayer.style.display = "block";
	this._band.updateEventTrackInfo(this._tracks.length, F.trackIncrement);
};
Timeline.OverviewEventPainter.prototype.softPaint = function() {
};
Timeline.OverviewEventPainter.prototype._prepareForPainting = function() {
	var A = this._band;
	this._tracks = [];
	if (this._highlightLayer != null) {
		A.removeLayerDiv(this._highlightLayer);
	}
	this._highlightLayer = A.createLayerDiv(105, "timeline-band-highlights");
	this._highlightLayer.style.display = "none";
	if (this._eventLayer != null) {
		A.removeLayerDiv(this._eventLayer);
	}
	this._eventLayer = A.createLayerDiv(110, "timeline-band-events");
	this._eventLayer.style.display = "none";
};
Timeline.OverviewEventPainter.prototype.paintEvent = function(B, C, D, A) {
	if (B.isInstant()) {
		this.paintInstantEvent(B, C, D, A);
	} else {
		this.paintDurationEvent(B, C, D, A);
	}
};
Timeline.OverviewEventPainter.prototype.paintInstantEvent = function(I, H, E, A) {
	var F = I.getStart();
	var B = Math.round(this._band.dateToPixelOffset(F));
	var C = I.getColor(), D = I.getClassName();
	if (D) {
		C = null;
	} else {
		C = C != null ? C : E.event.duration.color;
	}
	var G = this._paintEventTick(I, B, C, 100, H, E);
	this._createHighlightDiv(A, G, E);
};
Timeline.OverviewEventPainter.prototype.paintDurationEvent = function(L, K, H,
		B) {
	var A = L.getLatestStart();
	var I = L.getEarliestEnd();
	var J = Math.round(this._band.dateToPixelOffset(A));
	var C = Math.round(this._band.dateToPixelOffset(I));
	var F = 0;
	for (; F < this._tracks.length; F++) {
		if (C < this._tracks[F]) {
			break;
		}
	}
	this._tracks[F] = C;
	var E = L.getColor(), G = L.getClassName();
	if (G) {
		E = null;
	} else {
		E = E != null ? E : H.event.duration.color;
	}
	var D = this._paintEventTape(L, F, J, C, E, 100, K, H, G);
	this._createHighlightDiv(B, D, H);
};
Timeline.OverviewEventPainter.prototype._paintEventTape = function(K, B, D, L,
		E, C, H, G, F) {
	var I = H.trackOffset + B * H.trackIncrement;
	var A = L - D;
	var J = H.trackHeight;
	var M = this._timeline.getDocument().createElement("div");
	M.className = "timeline-small-event-tape";
	if (F) {
		M.className += " small-" + F;
	}
	M.style.left = D + "px";
	M.style.width = A + "px";
	M.style.top = I + "px";
	M.style.height = J + "px";
	if (E) {
		M.style.backgroundColor = E;
	}
	if (C < 100) {
		SimileAjax.Graphics.setOpacity(M, C);
	}
	this._eventLayer.appendChild(M);
	return {
		left : D,
		top : I,
		width : A,
		height : J,
		elmt : M
	};
};
Timeline.OverviewEventPainter.prototype._paintEventTick = function(J, C, D, B,
		G, F) {
	var I = F.event.overviewTrack.tickHeight;
	var H = G.trackOffset - I;
	var A = 1;
	var K = this._timeline.getDocument().createElement("div");
	K.className = "timeline-small-event-icon";
	K.style.left = C + "px";
	K.style.top = H + "px";
	var E = J.getClassName();
	if (E) {
		K.className += " small-" + E;
	}
	if (B < 100) {
		SimileAjax.Graphics.setOpacity(K, B);
	}
	this._eventLayer.appendChild(K);
	return {
		left : C,
		top : H,
		width : A,
		height : I,
		elmt : K
	};
};
Timeline.OverviewEventPainter.prototype._createHighlightDiv = function(A, C, E) {
	if (A >= 0) {
		var D = this._timeline.getDocument();
		var G = E.event;
		var B = G.highlightColors[Math.min(A, G.highlightColors.length - 1)];
		var F = D.createElement("div");
		F.style.position = "absolute";
		F.style.overflow = "hidden";
		F.style.left = (C.left - 1) + "px";
		F.style.width = (C.width + 2) + "px";
		F.style.top = (C.top - 1) + "px";
		F.style.height = (C.height + 2) + "px";
		F.style.background = B;
		this._highlightLayer.appendChild(F);
	}
};
Timeline.OverviewEventPainter.prototype.showBubble = function(A) {
};

/* sources.js */
Timeline.DefaultEventSource = function(A) {
	this._events = (A instanceof Object) ? A : new SimileAjax.EventIndex();
	this._listeners = [];
};
Timeline.DefaultEventSource.prototype.addListener = function(A) {
	this._listeners.push(A);
};
Timeline.DefaultEventSource.prototype.removeListener = function(B) {
	for ( var A = 0; A < this._listeners.length; A++) {
		if (this._listeners[A] == B) {
			this._listeners.splice(A, 1);
			break;
		}
	}
};
Timeline.DefaultEventSource.prototype.loadXML = function(G, A) {
	var C = this._getBaseURL(A);
	var H = G.documentElement.getAttribute("wiki-url");
	var J = G.documentElement.getAttribute("wiki-section");
	var F = G.documentElement.getAttribute("date-time-format");
	var E = this._events.getUnit().getParser(F);
	var D = G.documentElement.firstChild;
	var I = false;
	while (D != null) {
		if (D.nodeType == 1) {
			var L = "";
			if (D.firstChild != null && D.firstChild.nodeType == 3) {
				L = D.firstChild.nodeValue;
			}
			var B = (D.getAttribute("isDuration") === null && D
					.getAttribute("durationEvent") === null)
					|| D.getAttribute("isDuration") == "false"
					|| D.getAttribute("durationEvent") == "false";
			var K = new Timeline.DefaultEventSource.Event( {
				id : D.getAttribute("id"),
				start : E(D.getAttribute("start")),
				end : E(D.getAttribute("end")),
				latestStart : E(D.getAttribute("latestStart")),
				earliestEnd : E(D.getAttribute("earliestEnd")),
				instant : B,
				text : D.getAttribute("title"),
				description : L,
				image : this._resolveRelativeURL(D.getAttribute("image"), C),
				link : this._resolveRelativeURL(D.getAttribute("link"), C),
				icon : this._resolveRelativeURL(D.getAttribute("icon"), C),
				color : D.getAttribute("color"),
				textColor : D.getAttribute("textColor"),
				hoverText : D.getAttribute("hoverText"),
				classname : D.getAttribute("classname"),
				tapeImage : D.getAttribute("tapeImage"),
				tapeRepeat : D.getAttribute("tapeRepeat"),
				caption : D.getAttribute("caption"),
				eventID : D.getAttribute("eventID"),
				trackNum : D.getAttribute("trackNum")
			});
			K._node = D;
			K.getProperty = function(M) {
				return this._node.getAttribute(M);
			};
			K.setWikiInfo(H, J);
			this._events.add(K);
			I = true;
		}
		D = D.nextSibling;
	}
	if (I) {
		this._fire("onAddMany", []);
	}
};
Timeline.DefaultEventSource.prototype.loadJSON = function(H, B) {
	var D = this._getBaseURL(B);
	var J = false;
	if (H && H.events) {
		var I = ("wikiURL" in H) ? H.wikiURL : null;
		var K = ("wikiSection" in H) ? H.wikiSection : null;
		var F = ("dateTimeFormat" in H) ? H.dateTimeFormat : null;
		var E = this._events.getUnit().getParser(F);
		for ( var G = 0; G < H.events.length; G++) {
			var A = H.events[G];
			var C = A.isDuration
					|| (A.durationEvent != null && !A.durationEvent);
			var L = new Timeline.DefaultEventSource.Event( {
				id : ("id" in A) ? A.id : undefined,
				start : E(A.start),
				end : E(A.end),
				latestStart : E(A.latestStart),
				earliestEnd : E(A.earliestEnd),
				instant : C,
				text : A.title,
				description : A.description,
				image : this._resolveRelativeURL(A.image, D),
				link : this._resolveRelativeURL(A.link, D),
				icon : this._resolveRelativeURL(A.icon, D),
				color : A.color,
				textColor : A.textColor,
				hoverText : A.hoverText,
				classname : A.classname,
				tapeImage : A.tapeImage,
				tapeRepeat : A.tapeRepeat,
				caption : A.caption,
				eventID : A.eventID,
				trackNum : A.trackNum
			});
			L._obj = A;
			L.getProperty = function(M) {
				return this._obj[M];
			};
			L.setWikiInfo(I, K);
			this._events.add(L);
			J = true;
		}
	}
	if (J) {
		this._fire("onAddMany", []);
	}
};
Timeline.DefaultEventSource.prototype.loadSPARQL = function(I, B) {
	var E = this._getBaseURL(B);
	var H = "iso8601";
	var G = this._events.getUnit().getParser(H);
	if (I == null) {
		return;
	}
	var F = I.documentElement.firstChild;
	while (F != null && (F.nodeType != 1 || F.nodeName != "results")) {
		F = F.nextSibling;
	}
	var J = null;
	var L = null;
	if (F != null) {
		J = F.getAttribute("wiki-url");
		L = F.getAttribute("wiki-section");
		F = F.firstChild;
	}
	var K = false;
	while (F != null) {
		if (F.nodeType == 1) {
			var D = {};
			var A = F.firstChild;
			while (A != null) {
				if (A.nodeType == 1 && A.firstChild != null
						&& A.firstChild.nodeType == 1
						&& A.firstChild.firstChild != null
						&& A.firstChild.firstChild.nodeType == 3) {
					D[A.getAttribute("name")] = A.firstChild.firstChild.nodeValue;
				}
				A = A.nextSibling;
			}
			if (D["start"] == null && D["date"] != null) {
				D["start"] = D["date"];
			}
			var C = (D["isDuration"] === null && D["durationEvent"] === null)
					|| D["isDuration"] == "false"
					|| D["durationEvent"] == "false";
			var M = new Timeline.DefaultEventSource.Event( {
				id : D["id"],
				start : G(D["start"]),
				end : G(D["end"]),
				latestStart : G(D["latestStart"]),
				earliestEnd : G(D["earliestEnd"]),
				instant : C,
				text : D["title"],
				description : D["description"],
				image : this._resolveRelativeURL(D["image"], E),
				link : this._resolveRelativeURL(D["link"], E),
				icon : this._resolveRelativeURL(D["icon"], E),
				color : D["color"],
				textColor : D["textColor"],
				hoverText : D["hoverText"],
				caption : D["caption"],
				classname : D["classname"],
				tapeImage : D["tapeImage"],
				tapeRepeat : D["tapeRepeat"],
				eventID : D["eventID"],
				trackNum : D["trackNum"]
			});
			M._bindings = D;
			M.getProperty = function(N) {
				return this._bindings[N];
			};
			M.setWikiInfo(J, L);
			this._events.add(M);
			K = true;
		}
		F = F.nextSibling;
	}
	if (K) {
		this._fire("onAddMany", []);
	}
};
Timeline.DefaultEventSource.prototype.add = function(A) {
	this._events.add(A);
	this._fire("onAddOne", [ A ]);
};
Timeline.DefaultEventSource.prototype.addMany = function(A) {
	for ( var B = 0; B < A.length; B++) {
		this._events.add(A[B]);
	}
	this._fire("onAddMany", []);
};
Timeline.DefaultEventSource.prototype.clear = function() {
	this._events.removeAll();
	this._fire("onClear", []);
};
Timeline.DefaultEventSource.prototype.getEvent = function(A) {
	return this._events.getEvent(A);
};
Timeline.DefaultEventSource.prototype.getEventIterator = function(A, B) {
	return this._events.getIterator(A, B);
};
Timeline.DefaultEventSource.prototype.getEventReverseIterator = function(A, B) {
	return this._events.getReverseIterator(A, B);
};
Timeline.DefaultEventSource.prototype.getAllEventIterator = function() {
	return this._events.getAllIterator();
};
Timeline.DefaultEventSource.prototype.getCount = function() {
	return this._events.getCount();
};
Timeline.DefaultEventSource.prototype.getEarliestDate = function() {
	return this._events.getEarliestDate();
};
Timeline.DefaultEventSource.prototype.getLatestDate = function() {
	return this._events.getLatestDate();
};
Timeline.DefaultEventSource.prototype._fire = function(B, A) {
	for ( var C = 0; C < this._listeners.length; C++) {
		var D = this._listeners[C];
		if (B in D) {
			try {
				D[B].apply(D, A);
			} catch (E) {
				SimileAjax.Debug.exception(E);
			}
		}
	}
};
Timeline.DefaultEventSource.prototype._getBaseURL = function(A) {
	if (A.indexOf("://") < 0) {
		var C = this._getBaseURL(document.location.href);
		if (A.substr(0, 1) == "/") {
			A = C.substr(0, C.indexOf("/", C.indexOf("://") + 3)) + A;
		} else {
			A = C + A;
		}
	}
	var B = A.lastIndexOf("/");
	if (B < 0) {
		return "";
	} else {
		return A.substr(0, B + 1);
	}
};
Timeline.DefaultEventSource.prototype._resolveRelativeURL = function(A, B) {
	if (A == null || A == "") {
		return A;
	} else {
		if (A.indexOf("://") > 0) {
			return A;
		} else {
			if (A.substr(0, 1) == "/") {
				return B.substr(0, B.indexOf("/", B.indexOf("://") + 3)) + A;
			} else {
				return B + A;
			}
		}
	}
};
Timeline.DefaultEventSource.Event = function(A) {
	function D(E) {
		return (A[E] != null && A[E] != "") ? A[E] : null;
	}
	var C = A.id ? A.id.trim() : "";
	this._id = C.length > 0 ? C : Timeline.EventUtils.getNewEventID();
	this._instant = A.instant || (A.end == null);
	this._start = A.start;
	this._end = (A.end != null) ? A.end : A.start;
	this._latestStart = (A.latestStart != null) ? A.latestStart
			: (A.instant ? this._end : this._start);
	this._earliestEnd = (A.earliestEnd != null) ? A.earliestEnd : this._end;
	var B = [];
	if (this._start > this._latestStart) {
		this._latestStart = this._start;
		B.push("start is > latestStart");
	}
	if (this._start > this._earliestEnd) {
		this._earliestEnd = this._latestStart;
		B.push("start is > earliestEnd");
	}
	if (this._start > this._end) {
		this._end = this._earliestEnd;
		B.push("start is > end");
	}
	if (this._latestStart > this._earliestEnd) {
		this._earliestEnd = this._latestStart;
		B.push("latestStart is > earliestEnd");
	}
	if (this._latestStart > this._end) {
		this._end = this._earliestEnd;
		B.push("latestStart is > end");
	}
	if (this._earliestEnd > this._end) {
		this._end = this._earliestEnd;
		B.push("earliestEnd is > end");
	}
	this._eventID = D("eventID");
	this._text = (A.text != null) ? SimileAjax.HTML.deEntify(A.text) : "";
	if (B.length > 0) {
		this._text += " PROBLEM: " + B.join(", ");
	}
	this._description = SimileAjax.HTML.deEntify(A.description);
	this._image = D("image");
	this._link = D("link");
	this._title = D("hoverText");
	this._title = D("caption");
	this._icon = D("icon");
	this._color = D("color");
	this._textColor = D("textColor");
	this._classname = D("classname");
	this._tapeImage = D("tapeImage");
	this._tapeRepeat = D("tapeRepeat");
	this._trackNum = D("trackNum");
	if (this._trackNum != null) {
		this._trackNum = parseInt(this._trackNum);
	}
	this._wikiURL = null;
	this._wikiSection = null;
};
Timeline.DefaultEventSource.Event.prototype = {
	getID : function() {
		return this._id;
	},
	isInstant : function() {
		return this._instant;
	},
	isImprecise : function() {
		return this._start != this._latestStart
				|| this._end != this._earliestEnd;
	},
	getStart : function() {
		return this._start;
	},
	getEnd : function() {
		return this._end;
	},
	getLatestStart : function() {
		return this._latestStart;
	},
	getEarliestEnd : function() {
		return this._earliestEnd;
	},
	getEventID : function() {
		return this._eventID;
	},
	getText : function() {
		return this._text;
	},
	getDescription : function() {
		return this._description;
	},
	getImage : function() {
		return this._image;
	},
	getLink : function() {
		return this._link;
	},
	getIcon : function() {
		return this._icon;
	},
	getColor : function() {
		return this._color;
	},
	getTextColor : function() {
		return this._textColor;
	},
	getClassName : function() {
		return this._classname;
	},
	getTapeImage : function() {
		return this._tapeImage;
	},
	getTapeRepeat : function() {
		return this._tapeRepeat;
	},
	getTrackNum : function() {
		return this._trackNum;
	},
	getProperty : function(A) {
		return null;
	},
	getWikiURL : function() {
		return this._wikiURL;
	},
	getWikiSection : function() {
		return this._wikiSection;
	},
	setWikiInfo : function(B, A) {
		this._wikiURL = B;
		this._wikiSection = A;
	},
	fillDescription : function(A) {
		A.innerHTML = this._description;
	},
	fillWikiInfo : function(D) {
		D.style.display = "none";
		if (this._wikiURL == null || this._wikiSection == null) {
			return;
		}
		var C = this.getProperty("wikiID");
		if (C == null || C.length == 0) {
			C = this.getText();
		}
		if (C == null || C.length == 0) {
			return;
		}
		D.style.display = "inline";
		C = C.replace(/\s/g, "_");
		var B = this._wikiURL + this._wikiSection.replace(/\s/g, "_") + "/" + C;
		var A = document.createElement("a");
		A.href = B;
		A.target = "new";
		A.innerHTML = Timeline.strings[Timeline.clientLocale].wikiLinkLabel;
		D.appendChild(document.createTextNode("["));
		D.appendChild(A);
		D.appendChild(document.createTextNode("]"));
	},
	fillTime : function(A, B) {
		if (this._instant) {
			if (this.isImprecise()) {
				A.appendChild(A.ownerDocument.createTextNode(B
						.labelPrecise(this._start)));
				A.appendChild(A.ownerDocument.createElement("br"));
				A.appendChild(A.ownerDocument.createTextNode(B
						.labelPrecise(this._end)));
			} else {
				A.appendChild(A.ownerDocument.createTextNode(B
						.labelPrecise(this._start)));
			}
		} else {
			if (this.isImprecise()) {
				A.appendChild(A.ownerDocument.createTextNode(B
						.labelPrecise(this._start)
						+ " ~ " + B.labelPrecise(this._latestStart)));
				A.appendChild(A.ownerDocument.createElement("br"));
				A.appendChild(A.ownerDocument.createTextNode(B
						.labelPrecise(this._earliestEnd)
						+ " ~ " + B.labelPrecise(this._end)));
			} else {
				A.appendChild(A.ownerDocument.createTextNode(B
						.labelPrecise(this._start)));
				A.appendChild(A.ownerDocument.createElement("br"));
				A.appendChild(A.ownerDocument.createTextNode(B
						.labelPrecise(this._end)));
			}
		}
	},
	fillInfoBubble : function(A, E, M) {
		var K = A.ownerDocument;
		var J = this.getText();
		var H = this.getLink();
		var B = this.getImage();
		if (B != null) {
			var D = K.createElement("img");
			D.src = B;
			E.event.bubble.imageStyler(D);
			A.appendChild(D);
		}
		var L = K.createElement("div");
		var C = K.createTextNode(J);
		if (H != null) {
			var I = K.createElement("a");
			I.href = H;
			I.appendChild(C);
			L.appendChild(I);
		} else {
			L.appendChild(C);
		}
		E.event.bubble.titleStyler(L);
		A.appendChild(L);
		var N = K.createElement("div");
		this.fillDescription(N);
		E.event.bubble.bodyStyler(N);
		A.appendChild(N);
		var G = K.createElement("div");
		this.fillTime(G, M);
		E.event.bubble.timeStyler(G);
		A.appendChild(G);
		var F = K.createElement("div");
		this.fillWikiInfo(F);
		E.event.bubble.wikiStyler(F);
		A.appendChild(F);
	}
};

/* themes.js */
Timeline.ClassicTheme = new Object();
Timeline.ClassicTheme.implementations = [];
Timeline.ClassicTheme.create = function(B) {
	if (B == null) {
		B = Timeline.getDefaultLocale();
	}
	var A = Timeline.ClassicTheme.implementations[B];
	if (A == null) {
		A = Timeline.ClassicTheme._Impl;
	}
	return new A();
};
Timeline.ClassicTheme._Impl = function() {
	this.firstDayOfWeek = 0;
	this.autoWidth = false;
	this.autoWidthAnimationTime = 500;
	this.timeline_start = null;
	this.timeline_stop = null;
	this.ether = {
		backgroundColors : [],
		highlightOpacity : 50,
		interval : {
			line : {
				show : true,
				opacity : 25
			},
			weekend : {
				opacity : 30
			},
			marker : {
				hAlign : "Bottom",
				vAlign : "Right"
			}
		}
	};
	this.event = {
		track : {
			height : 10,
			gap : 2,
			offset : 2,
			autoWidthMargin : 1.5
		},
		overviewTrack : {
			offset : 20,
			tickHeight : 6,
			height : 2,
			gap : 1,
			autoWidthMargin : 5
		},
		tape : {
			height : 4
		},
		instant : {
			icon : Timeline.urlPrefix + "images/dull-blue-circle.png",
			iconWidth : 10,
			iconHeight : 10,
			impreciseOpacity : 20,
			impreciseIconMargin : 3
		},
		duration : {
			impreciseOpacity : 20
		},
		label : {
			backgroundOpacity : 50,
			offsetFromLine : 3
		},
		highlightColors : [ "#FFFF00", "#FFC000", "#FF0000", "#0000FF" ],
		highlightLabelBackground : false,
		bubble : {
			width : 250,
			maxHeight : 0,
			titleStyler : function(A) {
				A.className = "timeline-event-bubble-title";
			},
			bodyStyler : function(A) {
				A.className = "timeline-event-bubble-body";
			},
			imageStyler : function(A) {
				A.className = "timeline-event-bubble-image";
			},
			wikiStyler : function(A) {
				A.className = "timeline-event-bubble-wiki";
			},
			timeStyler : function(A) {
				A.className = "timeline-event-bubble-time";
			}
		}
	};
	this.mouseWheel = "scroll";
};

/* timeline.js */
Timeline.version = "2.3.0";
Timeline.ajax_lib_version = SimileAjax.version;
Timeline.display_version = Timeline.version + " (with Ajax lib "
		+ Timeline.ajax_lib_version + ")";
Timeline.strings = {};
Timeline.HORIZONTAL = 0;
Timeline.VERTICAL = 1;
Timeline._defaultTheme = null;
Timeline.getDefaultLocale = function() {
	return Timeline.clientLocale;
};
Timeline.create = function(D, C, E, F) {
	if (Timeline.timelines == null) {
		Timeline.timelines = [];
	}
	var B = Timeline.timelines.length;
	Timeline.timelines[B] = null;
	var A = new Timeline._Impl(D, C, E, F, B);
	Timeline.timelines[B] = A;
	return A;
};
Timeline.createBandInfo = function(F) {
	var G = ("theme" in F) ? F.theme : Timeline.getDefaultTheme();
	var D = ("eventSource" in F) ? F.eventSource : null;
	var H = new Timeline.LinearEther( {
		centersOn : ("date" in F) ? F.date : new Date(),
		interval : SimileAjax.DateTime.gregorianUnitLengths[F.intervalUnit],
		pixelsPerInterval : F.intervalPixels,
		theme : G
	});
	var C = new Timeline.GregorianEtherPainter( {
		unit : F.intervalUnit,
		multiple : ("multiple" in F) ? F.multiple : 1,
		theme : G,
		align : ("align" in F) ? F.align : undefined
	});
	var I = {
		showText : ("showEventText" in F) ? F.showEventText : true,
		theme : G
	};
	if ("eventPainterParams" in F) {
		for ( var A in F.eventPainterParams) {
			I[A] = F.eventPainterParams[A];
		}
	}
	if ("trackHeight" in F) {
		I.trackHeight = F.trackHeight;
	}
	if ("trackGap" in F) {
		I.trackGap = F.trackGap;
	}
	var B = ("overview" in F && F.overview) ? "overview"
			: ("layout" in F ? F.layout : "original");
	var E;
	if ("eventPainter" in F) {
		E = new F.eventPainter(I);
	} else {
		switch (B) {
		case "overview":
			E = new Timeline.OverviewEventPainter(I);
			break;
		case "detailed":
			E = new Timeline.DetailedEventPainter(I);
			break;
		default:
			E = new Timeline.OriginalEventPainter(I);
		}
	}
	return {
		width : F.width,
		eventSource : D,
		timeZone : ("timeZone" in F) ? F.timeZone : 0,
		ether : H,
		etherPainter : C,
		eventPainter : E,
		theme : G,
		zoomIndex : ("zoomIndex" in F) ? F.zoomIndex : 0,
		zoomSteps : ("zoomSteps" in F) ? F.zoomSteps : null
	};
};
Timeline.createHotZoneBandInfo = function(F) {
	var G = ("theme" in F) ? F.theme : Timeline.getDefaultTheme();
	var D = ("eventSource" in F) ? F.eventSource : null;
	var H = new Timeline.HotZoneEther( {
		centersOn : ("date" in F) ? F.date : new Date(),
		interval : SimileAjax.DateTime.gregorianUnitLengths[F.intervalUnit],
		pixelsPerInterval : F.intervalPixels,
		zones : F.zones,
		theme : G
	});
	var C = new Timeline.HotZoneGregorianEtherPainter( {
		unit : F.intervalUnit,
		zones : F.zones,
		theme : G,
		align : ("align" in F) ? F.align : undefined
	});
	var I = {
		showText : ("showEventText" in F) ? F.showEventText : true,
		theme : G
	};
	if ("eventPainterParams" in F) {
		for ( var A in F.eventPainterParams) {
			I[A] = F.eventPainterParams[A];
		}
	}
	if ("trackHeight" in F) {
		I.trackHeight = F.trackHeight;
	}
	if ("trackGap" in F) {
		I.trackGap = F.trackGap;
	}
	var B = ("overview" in F && F.overview) ? "overview"
			: ("layout" in F ? F.layout : "original");
	var E;
	if ("eventPainter" in F) {
		E = new F.eventPainter(I);
	} else {
		switch (B) {
		case "overview":
			E = new Timeline.OverviewEventPainter(I);
			break;
		case "detailed":
			E = new Timeline.DetailedEventPainter(I);
			break;
		default:
			E = new Timeline.OriginalEventPainter(I);
		}
	}
	return {
		width : F.width,
		eventSource : D,
		timeZone : ("timeZone" in F) ? F.timeZone : 0,
		ether : H,
		etherPainter : C,
		eventPainter : E,
		theme : G,
		zoomIndex : ("zoomIndex" in F) ? F.zoomIndex : 0,
		zoomSteps : ("zoomSteps" in F) ? F.zoomSteps : null
	};
};
Timeline.getDefaultTheme = function() {
	if (Timeline._defaultTheme == null) {
		Timeline._defaultTheme = Timeline.ClassicTheme.create(Timeline
				.getDefaultLocale());
	}
	return Timeline._defaultTheme;
};
Timeline.setDefaultTheme = function(A) {
	Timeline._defaultTheme = A;
};
Timeline.loadXML = function(A, C) {
	var D = function(G, F, E) {
		alert("Failed to load data xml from " + A + "\n" + G);
	};
	var B = function(F) {
		var E = F.responseXML;
		if (!E.documentElement && F.responseStream) {
			E.load(F.responseStream);
		}
		C(E, A);
	};
	SimileAjax.XmlHttp.get(A, D, B);
};
Timeline.loadJSON = function(url, f) {
	var fError = function(statusText, status, xmlhttp) {
		alert("Failed to load json data from " + url + "\n" + statusText);
	};
	var fDone = function(xmlhttp) {
		f(eval("(" + xmlhttp.responseText + ")"), url);
	};
	SimileAjax.XmlHttp.get(url, fError, fDone);
};
Timeline.getTimelineFromID = function(A) {
	return Timeline.timelines[A];
};
Timeline.writeVersion = function(A) {
	document.getElementById(A).innerHTML = this.display_version;
};
Timeline._Impl = function(C, B, D, E, A) {
	SimileAjax.WindowManager.initialize();
	this._containerDiv = C;
	this._bandInfos = B;
	this._orientation = D == null ? Timeline.HORIZONTAL : D;
	this._unit = (E != null) ? E : SimileAjax.NativeDateUnit;
	this._starting = true;
	this._autoResizing = false;
	this.autoWidth = B && B[0] && B[0].theme && B[0].theme.autoWidth;
	this.autoWidthAnimationTime = B && B[0] && B[0].theme
			&& B[0].theme.autoWidthAnimationTime;
	this.timelineID = A;
	this.timeline_start = B && B[0] && B[0].theme && B[0].theme.timeline_start;
	this.timeline_stop = B && B[0] && B[0].theme && B[0].theme.timeline_stop;
	this.timeline_at_start = false;
	this.timeline_at_stop = false;
	this._initialize();
};
Timeline._Impl.prototype.dispose = function() {
	for ( var A = 0; A < this._bands.length; A++) {
		this._bands[A].dispose();
	}
	this._bands = null;
	this._bandInfos = null;
	this._containerDiv.innerHTML = "";
	Timeline.timelines[this.timelineID] = null;
};
Timeline._Impl.prototype.getBandCount = function() {
	return this._bands.length;
};
Timeline._Impl.prototype.getBand = function(A) {
	return this._bands[A];
};
Timeline._Impl.prototype.finishedEventLoading = function() {
	this._autoWidthCheck(true);
	this._starting = false;
};
Timeline._Impl.prototype.layout = function() {
	this._autoWidthCheck(true);
	this._distributeWidths();
};
Timeline._Impl.prototype.paint = function() {
	for ( var A = 0; A < this._bands.length; A++) {
		this._bands[A].paint();
	}
};
Timeline._Impl.prototype.getDocument = function() {
	return this._containerDiv.ownerDocument;
};
Timeline._Impl.prototype.addDiv = function(A) {
	this._containerDiv.appendChild(A);
};
Timeline._Impl.prototype.removeDiv = function(A) {
	this._containerDiv.removeChild(A);
};
Timeline._Impl.prototype.isHorizontal = function() {
	return this._orientation == Timeline.HORIZONTAL;
};
Timeline._Impl.prototype.isVertical = function() {
	return this._orientation == Timeline.VERTICAL;
};
Timeline._Impl.prototype.getPixelLength = function() {
	return this._orientation == Timeline.HORIZONTAL ? this._containerDiv.offsetWidth
			: this._containerDiv.offsetHeight;
};
Timeline._Impl.prototype.getPixelWidth = function() {
	return this._orientation == Timeline.VERTICAL ? this._containerDiv.offsetWidth
			: this._containerDiv.offsetHeight;
};
Timeline._Impl.prototype.getUnit = function() {
	return this._unit;
};
Timeline._Impl.prototype.getWidthStyle = function() {
	return this._orientation == Timeline.HORIZONTAL ? "height" : "width";
};
Timeline._Impl.prototype.loadXML = function(B, D) {
	var A = this;
	var E = function(H, G, F) {
		alert("Failed to load data xml from " + B + "\n" + H);
		A.hideLoadingMessage();
	};
	var C = function(G) {
		try {
			var F = G.responseXML;
			if (!F.documentElement && G.responseStream) {
				F.load(G.responseStream);
			}
			D(F, B);
		} finally {
			A.hideLoadingMessage();
		}
	};
	this.showLoadingMessage();
	window.setTimeout(function() {
		SimileAjax.XmlHttp.get(B, E, C);
	}, 0);
};
Timeline._Impl.prototype.loadJSON = function(url, f) {
	var tl = this;
	var fError = function(statusText, status, xmlhttp) {
		alert("Failed to load json data from " + url + "\n" + statusText);
		tl.hideLoadingMessage();
	};
	var fDone = function(xmlhttp) {
		try {
			f(eval("(" + xmlhttp.responseText + ")"), url);
		} finally {
			tl.hideLoadingMessage();
		}
	};
	this.showLoadingMessage();
	window.setTimeout(function() {
		SimileAjax.XmlHttp.get(url, fError, fDone);
	}, 0);
};
Timeline._Impl.prototype._autoWidthScrollListener = function(A) {
	A.getTimeline()._autoWidthCheck(false);
};
Timeline._Impl.prototype._autoWidthCheck = function(C) {
	var A = this;
	var B = A._starting;
	var D = 0;
	function E() {
		var G = A.getWidthStyle();
		if (B) {
			A._containerDiv.style[G] = D + "px";
		} else {
			A._autoResizing = true;
			var H = {};
			H[G] = D + "px";
			SimileAjax.jQuery(A._containerDiv).animate(H,
					A.autoWidthAnimationTime, "linear", function() {
						A._autoResizing = false;
					});
		}
	}
	function F() {
		var H = 0;
		var G = A.getPixelWidth();
		if (A._autoResizing) {
			return;
		}
		for ( var I = 0; I < A._bands.length; I++) {
			A._bands[I].checkAutoWidth();
			H += A._bandInfos[I].width;
		}
		if (H > G || C) {
			D = H;
			E();
			A._distributeWidths();
		}
	}
	if (!A.autoWidth) {
		return;
	}
	F();
};
Timeline._Impl.prototype._initialize = function() {
	var H = this._containerDiv;
	var E = H.ownerDocument;
	H.className = H.className.split(" ").concat("timeline-container").join(" ");
	var C = (this.isHorizontal()) ? "horizontal" : "vertical";
	H.className += " timeline-" + C;
	while (H.firstChild) {
		H.removeChild(H.firstChild);
	}
	var A = SimileAjax.Graphics.createTranslucentImage(Timeline.urlPrefix
			+ (this.isHorizontal() ? "images/copyright-vertical.png"
					: "images/copyright.png"));
	A.className = "timeline-copyright";
	A.title = "Timeline copyright SIMILE - www.code.google.com/p/simile-widgets/";
	SimileAjax.DOM.registerEvent(A, "click", function() {
		window.location = "http://code.google.com/p/simile-widgets/";
	});
	H.appendChild(A);
	this._bands = [];
	for ( var B = 0; B < this._bandInfos.length; B++) {
		var G = new Timeline._Band(this, this._bandInfos[B], B);
		this._bands.push(G);
	}
	this._distributeWidths();
	for ( var B = 0; B < this._bandInfos.length; B++) {
		var F = this._bandInfos[B];
		if ("syncWith" in F) {
			this._bands[B].setSyncWithBand(this._bands[F.syncWith],
					("highlight" in F) ? F.highlight : false);
		}
	}
	if (this.autoWidth) {
		for ( var B = 0; B < this._bands.length; B++) {
			this._bands[B].addOnScrollListener(this._autoWidthScrollListener);
		}
	}
	var D = SimileAjax.Graphics.createMessageBubble(E);
	D.containerDiv.className = "timeline-message-container";
	H.appendChild(D.containerDiv);
	D.contentDiv.className = "timeline-message";
	D.contentDiv.innerHTML = "<img src='" + Timeline.urlPrefix
			+ "images/progress-running.gif' /> Loading...";
	this.showLoadingMessage = function() {
		D.containerDiv.style.display = "block";
	};
	this.hideLoadingMessage = function() {
		D.containerDiv.style.display = "none";
	};
};
Timeline._Impl.prototype._distributeWidths = function() {
	var G = this.getPixelLength();
	var B = this.getPixelWidth();
	var C = 0;
	for ( var F = 0; F < this._bands.length; F++) {
		var J = this._bands[F];
		var I = this._bandInfos[F];
		var E = I.width;
		var D;
		if (typeof E == "string") {
			var H = E.indexOf("%");
			if (H > 0) {
				var A = parseInt(E.substr(0, H));
				D = Math.round(A * B / 100);
			} else {
				D = parseInt(E);
			}
		} else {
			D = E;
		}
		J.setBandShiftAndWidth(C, D);
		J.setViewLength(G);
		C += D;
	}
};
Timeline._Impl.prototype.shiftOK = function(C, B) {
	var F = B > 0, A = B < 0;
	if ((F && this.timeline_start == null) || (A && this.timeline_stop == null)
			|| (B == 0)) {
		return (true);
	}
	var H = false;
	for ( var E = 0; E < this._bands.length && !H; E++) {
		H = this._bands[E].busy();
	}
	if (H) {
		return (true);
	}
	if ((F && this.timeline_at_start) || (A && this.timeline_at_stop)) {
		return (false);
	}
	var D = false;
	for ( var E = 0; E < this._bands.length && !D; E++) {
		var G = this._bands[E];
		if (F) {
			D = (E == C ? G.getMinVisibleDateAfterDelta(B) : G
					.getMinVisibleDate()) >= this.timeline_start;
		} else {
			D = (E == C ? G.getMaxVisibleDateAfterDelta(B) : G
					.getMaxVisibleDate()) <= this.timeline_stop;
		}
	}
	if (F) {
		this.timeline_at_start = !D;
		this.timeline_at_stop = false;
	} else {
		this.timeline_at_stop = !D;
		this.timeline_at_start = false;
	}
	return (D);
};
Timeline._Impl.prototype.zoom = function(D, A, G, F) {
	var C = new RegExp("^timeline-band-([0-9]+)$");
	var E = null;
	var B = C.exec(F.id);
	if (B) {
		E = parseInt(B[1]);
	}
	if (E != null) {
		this._bands[E].zoom(D, A, G, F);
	}
	this.paint();
};

/* units.js */
Timeline.NativeDateUnit = new Object();
Timeline.NativeDateUnit.createLabeller = function(B, A) {
	return new Timeline.GregorianDateLabeller(B, A);
};
Timeline.NativeDateUnit.makeDefaultValue = function() {
	return new Date();
};
Timeline.NativeDateUnit.cloneValue = function(A) {
	return new Date(A.getTime());
};
Timeline.NativeDateUnit.getParser = function(A) {
	if (typeof A == "string") {
		A = A.toLowerCase();
	}
	return (A == "iso8601" || A == "iso 8601") ? Timeline.DateTime.parseIso8601DateTime
			: Timeline.DateTime.parseGregorianDateTime;
};
Timeline.NativeDateUnit.parseFromObject = function(A) {
	return Timeline.DateTime.parseGregorianDateTime(A);
};
Timeline.NativeDateUnit.toNumber = function(A) {
	return A.getTime();
};
Timeline.NativeDateUnit.fromNumber = function(A) {
	return new Date(A);
};
Timeline.NativeDateUnit.compare = function(D, C) {
	var B, A;
	if (typeof D == "object") {
		B = D.getTime();
	} else {
		B = Number(D);
	}
	if (typeof C == "object") {
		A = C.getTime();
	} else {
		A = Number(C);
	}
	return B - A;
};
Timeline.NativeDateUnit.earlier = function(B, A) {
	return Timeline.NativeDateUnit.compare(B, A) < 0 ? B : A;
};
Timeline.NativeDateUnit.later = function(B, A) {
	return Timeline.NativeDateUnit.compare(B, A) > 0 ? B : A;
};
Timeline.NativeDateUnit.change = function(A, B) {
	return new Date(A.getTime() + B);
};
